17

promise API を使用して、2 つの非同期リクエストを並行して送信し、結合された結果をレスポンスとして解決する方法。

var get = function(id){
            var res1, res2;
            var deferred = $q.defer();
            Db.get(id, "abc")
                .then(function (d) {
                    //deferred.resolve(d));
                    res1 = d;
                }, function (e) {
                    //error
                });

            Db.get(id, "def")
                .then(function (d) {
                    //deferred.resolve(d));
                    res2 = d;
                }, function (e) {
                    //error
                });

            //?????? how to return {res1:res1 , res2: res2}

            return deferred.promise;
        };

今、 get() を呼び出すと

get(123).then(function(d)){
// d= {res1: res1, res2: res2}
},
...

示されているように、結合された結果を取得する必要があります。Angular promise API でこれを行うには?

4

3 に答える 3

36

@Matt が言ったように、 を使用する必要があります$q.allが、使用法は正しくありません。AngularJS はサポートしておらず.done.failとにかく、複数の値の約束などはなく、配列の約束があるだけなので、そのようには機能しません。

完全なQを使用してこれを書いている場合、次のように記述します。

var get = function (id) {
    return Q.all([Db.get(id, "abc"), Db.get(id, "def")])
        .spread(function (res1, res2) {
            return {res1: res1, res2: res2};
        });//the error case is handled automatically
};

この場合、関数の引数にプロミスの配列の結果を広げることを除いて、 は次.spreadのように動作します。これを AngularJS の promise メソッドを使用するように変更するには、. これにより、次の解決策が導き出されます。.thenonFulfilled.spread

var get = function (id) {
    return $q.all([Db.get(id, "abc"), Db.get(id, "def")])
        .then(function (res) {
            return {res1: res[0], res2: res[1]};
        });//the error case is handled automatically
};

.thenこれの優れた点は、フィルターとして機能するため、エラー伝播のすべての核心を処理し、部分的な結果を保存することから解放されることです。エラー ハンドラを省略すると、エラーが自動的に伝播されます。これは、入力プロミスのいずれかが拒否された場合、結果が拒否されることを意味します。両方の約束が正常に満たされた場合、 res はそれらの解決値の配列です。

于 2013-05-01T02:28:20.487 に答える