1

promise オブジェクトの配列を配列の promise オブジェクトに変換する方法はありますか? $q.all(promises)AngularJSのように動作するものを探しています。

これが私のコードです:

var getPages = function(courses) {
  var courses_promises = courses.filter(function(item) {
    return item.courses[0].home_link;
  }).map(function(item) {
    deferred = $.Deferred();
    item["class_link"] = item.courses[0].home_link;
    item["home_link"] = item["class_link"] + "class/index";
    $.get(item.home_link)
       .then(function(response) {
        item["html"] = response;
        deferred.resolve(item);
       });
    return deferred.promise();
  });
  return $.when.apply($, courses_promises);
};  

関数が、値の配列で解決される単一のプロミスを返すようにしますgetPages。各値は、promise 配列の同じインデックスにあるプロミスに対応します。Promise のいずれかが拒否で解決された場合、この結果の Promise は同じ拒否で解決されます。

そして、私は使用します

getPages.then(getEvents)

どこでgetEventsによって解決された要素を持つ配列を期待する別の関数getPagesです。

誰でも私を助けることができますか?ありがとうございました!

4

3 に答える 3

8

別のライブラリを取り込みたくない人のために (Q が優れていることは確認できますが、ノードに最適なプロミス システムのようです)、Q.alljQuery を使用した実装を次に示しますwhen

function all(arrayOfPromises) {
    return jQuery.when.apply(jQuery, arrayOfPromises).then(function() {
        return Array.prototype.slice.call(arguments, 0);
    });
};

これには、次の 2 つの問題に対処する必要があります。

  1. は配列を受け入れるのではなくjQuery.when、可変数の引数を取るため、applypromise の配列を渡すために で呼び出す必要があります。
  2. 組み合わされた promise は、単一の配列引数ではなく、複数の引数で解決されるため、arguments( を使用して) 実数の配列に変換する必要がありsliceます。

したがって:

var getAnimal = function(animal) {
    return $.get('animals/' + animal);
};

var arrayOfPromisesToAnimals = ['frog', 'cat', 'horse'].map(getAnimal);

var promiseToArrayOfAnimals = all(arrayOfPromisesToAnimals);

promiseToArrayOfAnimals.then(function(arrayOfAnimals) {

    arrayOfAnimals.forEach(function(animal) {
        console.log(animal);
    });
});
于 2013-09-13T10:57:59.313 に答える
2

Qを使用している場合は、次のようにします。

Q.all(promises)

Q の設計の方がはるかに優れているため、一般的には、promise に jQuery を使用するよりもはるかに優れたアイデアです。さらに、Q.alljQuery に約束を与えることは安全であり、うまく同化します。

Q を使用したくない場合は、$.when同様のことを行うと思いますが、それほどクリーンでシンプルではありません。

于 2013-04-25T13:15:13.120 に答える
0

は配列です。jQuerypromisesに相当するものQ.all(promises)は次のとおりです。

jQuery.when.apply(null, promises);

多くの jQuery プログラマーは、これが不器用であることに同意しながら使用します。jQuery.when()配列を受け入れる方が良いでしょう。

編集

getPages、私は完全な機能を見てきました.jQueryソリューションについてより良いアドバイスをすることができます:

次のように簡単だと思います:

var getPages = function(courses) {
    var promises = courses.map(function(c) {
        if(!c.courses[0].home_link) return null;//filter action
        return $.get(c.courses[0].home_link + "class/index").done(function(response) {
            c.html = response;
        });
    }).get();//Remove jQuery wrapper to reveal an array of jqXHR promises.
    return $.when.apply($, promises);
};

$.when.apply($, promises)線は常に正しかった。promisesjQuery コレクションではなく、本物の JavaScript 配列であることを確認する必要があります。

于 2013-04-25T22:24:06.470 に答える