私はプロミスに依存するangularjsアプリを書いています。それは機能していますが、もっと最適にできるのではないかと思います。
コードの冒頭で、いくつかのデータを取得する約束を作成しています。これが完了したら、このデータをすべて使用するいくつかの関数を実行します。関数はアプリの無関係な部分にアタッチされているため、約束にアタッチされる順序はわかりません。順番に行う必要もありません。
_app.service("Fetch", function ($q){
return function() {
var def = $q.defer();
somelibrary.asynccall(function(error, data){ //callback
if (error) def.reject(error);
else def.resolve(data);
});
return def.promise;
};
});
app.controller("ctrl", function ($scope, Fetch) {
var prom = Fetch();
//somewhere:
prom.then(function(data){$scope.var1 = data["VAR1"];});
//somewhere else:
prom.then(function(data){$scope.var2 = data["VAR2"]});
});
_
ここでの主な欠点は、後のthen
sが先行のものが終了したときにのみ実行されることです。これはここでは必要ありません。
また、すべてのfunction(data){...}
内に_return data
_を追加する必要があります。そうしないと、次のthen()
にdata
がありません。
これを行う別の方法はありませんか?この状況にもっと適していますか?
編集:@ jfriend00で述べたように、私は間違っていました。実際、2つの関数は両方とも、promiseが正常に解決されるとすぐに並行して実行され、チェーン化されておらず、したがって互いに依存していません。ご協力いただきありがとうございます
問題を解決しているように見えるので、コメントを回答に変える:
パターンでは、promiseが解決されると、同じpromiseの2つの.then()
呼び出しが次々に呼び出されます。 2番目の.then()
は元のpromiseとのみ関係があり、最初の.then()
で起こることとは関係ありません。
これらはチェーンされていないため、2番目の.then()
は最初の.then()
から返されるものに依存せず、両方に同じデータが渡されます。それらは、同じイベントをリッスンする2つのイベントハンドラーのような、同じ約束の複数のウォッチャーです。
同じpromiseの2つの.then()
ハンドラーは、promiseにアタッチされた順序で呼び出され、両方に同じデータが渡されます。
次の2つの回答をご覧ください。
promise.then.thenとpromise.then; promise.thenには違いがあります
chainingp.then(...).then(...)
vs.branchingp.then(...); p.then(...)
の詳細については、promiseを参照してください。
並列実行が必要です: $ q.all()
$q.all(
function1,
function2,
function3
).then(function(responses) {
console.log(responses);
});