web-dev-qa-db-ja.com

単一のanglejsプロミスの複数の `.then()`-すべてが_original_データを使用します

私はプロミスに依存する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"]});
});
_

ここでの主な欠点は、後のthensが先行のものが終了したときにのみ実行されることです。これはここでは必要ありません。

また、すべてのfunction(data){...}内に_return data_を追加する必要があります。そうしないと、次のthen()dataがありません。

これを行う別の方法はありませんか?この状況にもっと適していますか?


編集:@ jfriend00で述べたように、私は間違っていました。実際、2つの関数は両方とも、promiseが正常に解決されるとすぐに並行して実行され、チェーン化されておらず、したがって互いに依存していません。ご協力いただきありがとうございます

46
ElRudi

問題を解決しているように見えるので、コメントを回答に変える:

パターンでは、promiseが解決されると、同じpromiseの2つの.then()呼び出しが次々に呼び出されます。 2番目の.then()は元のpromiseとのみ関係があり、最初の.then()で起こることとは関係ありません。

これらはチェーンされていないため、2番目の.then()は最初の.then()から返されるものに依存せず、両方に同じデータが渡されます。それらは、同じイベントをリッスンする2つのイベントハンドラーのような、同じ約束の複数のウォッチャーです。

同じpromiseの2つの.then()ハンドラーは、promiseにアタッチされた順序で呼び出され、両方に同じデータが渡されます。

次の2つの回答をご覧ください。

promise.then.thenとpromise.then; promise.thenには違いがあります

javascriptの約束を理解する;スタックとチェーン

chainingp.then(...).then(...) vs.branchingp.then(...); p.then(...)の詳細については、promiseを参照してください。

76
jfriend00

並列実行が必要です: $ q.all()

$q.all(
    function1,
    function2,
    function3
).then(function(responses) {
    console.log(responses);
});
3
monkeyinsight