2016-03-22 14 views
0

私はChrome.System apisから情報を収集し、すべてのデータを一度に利用するChrome拡張機能に取り組んでいます。もちろん、これらの呼び出しは非同期です。私はJSに多大な経験がありませんので、私はこれをできるだけ簡単にやっていることを確認したいと思います。
私が考えることができる唯一の方法は、コールバックに入れ子関数を作ることです。同様非同期の結果を待っているChromeシステムコール

何か:それは非常に迅速にコードを読むことは非常に難しいでしょうよう

chrome.identity.getProfileUserInfo(function(userinfo){ 
      getLocalIPs(userinfo.email, function(email, ips){ 
//keep passing data and nesting here.... and then do something after all calls are made 
} 
} 

これがそうです。このようなことをするために推奨される方法は何ですか?同期のプログラミングでは、私はこのような何かを達成したいと思う:ネストされた関数は、負担のいくつかのレベルになる

var email = getEmail(); 
var ip = getIP(); 
var processor = getProcessor(); 

dosomething(email, ip, processor); 

答えて

1

を私は順序で各非同期呼び出しを実行し、完了時に各コールバックのためのフラグを設定することをお勧め。

runIfReady()を作成して、doSomething()を起動する前に必要なフラグがすべて設定されているかどうかを確認します。すべての非同期コールバックの最後にrunIfReady()を追加できます。すべての詳細が入力されると、doSomething()がすぐに実行されます。

doSomething()の起動は心配する必要はありません。コールバックは非同期ですが、一度に1つだけ実行されるためです。

+0

感謝を!それは素晴らしい仕事でした。 – user568551

+0

@ user568551喜んで(:コールバック、フラグなどを整理する場合は、[プロトタイプパターン](https://carldanley.com/js-prototype-pattern/)をすべてラップすると考えられます乾杯。 –

5

JavaScriptには、それを処理するためのツールがネイティブにあるときに、なぜホイールを改革するのですか?

特に、約束です。コンセプトを紹介するvery good article at HTML5Rockがあります。

あなたが約束を返す関数ます

function getEmailPromise() { 
    return new Promise(function(resolve, reject) { 
    chrome.identity.getProfileUserInfo(function(userinfo) { 
     resolve(userinfo.email); 
    }); 
    }); 
} 

をそして、あなたが欲しいものを正確に行うことができます。

var email = getEmailPromise(); 
var ip = getIPPromise(); 
var processor = getProcessorPromise(); 

Promise.all([email, ip, processor]).then(function(data) { 
    // data is [email, ip, processor] 
}); 
+0

私は本当にこの答えを受け入れるべきだと思っています。[Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)は、遅延計算と非同期計算に使用されます。 'p1.then(...)'や 'Promiss.all(...)... then ...(...)'のようにもっと優雅なコードを書くことができます –

+0

クロムの文脈では拡張性、約束は良い解決策ですが、一般的な目的のためには、[互換性は普遍的ではありません](http://caniuse.com/#feat=promises)に注意してください。しばらくの間 –

関連する問題