1. ホーム
  2. javascript

[解決済み] $.when.apply($, someArray)は何をするのですか?

2022-05-17 19:48:43

質問

私は Deferreds と Promises について読んでいます。 を読んでいて、何度も $.when.apply($, someArray) . 私はこれが正確に何をするのか少し不明で、次のような説明を探しています。 一行 が正確に動作するという説明を探しています (コードスニペット全体ではありません)。 ここにいくつかのコンテキストがあります。

var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];

for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

$.when.apply($, processItemsDeferred).then(everythingDone); 

function processItem(data) {
  var dfd = $.Deferred();
  console.log('called processItem');

  //in the real world, this would probably make an AJAX call.
  setTimeout(function() { dfd.resolve() }, 2000);    

  return dfd.promise();
}

function everythingDone(){
  console.log('processed all items');
}

どのように解決するのですか?

.apply は、引数の配列を使って関数を呼び出すために使われます。 配列の各要素を受け取り、それぞれを関数の引数として使用します。 .apply はコンテキストを変更することもできます ( this ) を変更することもできます。

では $.when . これは、"これらの約束がすべて解決されたら...何かをしてください"と言うために使われるものです。 これは無限の(可変)数のパラメータを取ります。

あなたの場合、約束の配列を持っています。 $.when . 配列そのものを $.when は動作しません。なぜなら、それはパラメータが配列ではなく、約束であることを期待しているからです。

そこで .apply の出番です。 これは配列を受け取り $.when を呼び出します(そして、各要素をパラメータとして this に設定されます。 jQuery / $ ) で、すべてうまくいきます :-)