$.when 是不是以与数组中相同的顺序解析延迟数组?

Posted

技术标签:

【中文标题】$.when 是不是以与数组中相同的顺序解析延迟数组?【英文标题】:Does $.when resolve array of deferreds in the same order as they were in the array?$.when 是否以与数组中相同的顺序解析延迟数组? 【发布时间】:2016-05-31 13:41:05 【问题描述】:

我有一个未知数量的延迟数组,我试图用 $.when 来解决。当所有的延迟都已解决后,'.then' 函数是否会按照我在数组中输入的顺序将已解决的延迟返回给我?

伪代码示例:

var deferreds = [];
for(0,1,2,...,x)  
   var def = JsonRpc(...);
   deferreds.push(def);

$.when.apply($, deferreds).then(function () 
  console.log(arguments.length); //outputs a number >= 0
  for(0,1,2,...,x) 
     console.log("Defered: ", arguments[0,1,2,...,x])
  
);

deferreds[0] 是否等于 arguments[0] 并且 deferreds[x] 是否等于 arguments[x]?

提前感谢所有回复! //埃德文

【问题讨论】:

我相信这是一个重复的问题:***.com/questions/26239821/… 【参考方案1】:

根据文档:

传递给 doneCallbacks 的参数提供解析的值 对于每个 Deferred,并匹配 Deferred 的顺序 传递给 jQuery.when()。例如:

var d1 = $.Deferred();
var d2 = $.Deferred();

$.when( d1, d2 ).done(function ( v1, v2 ) 
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
);

d1.resolve( "Fish" );
d2.resolve( "Pizza" );

一个小例子:

var deferreds = [];
for (var i = 0; i < 3; i++) 
  var def = $.Deferred();
  deferreds.push(def);


$.when.apply($, deferreds).then(function() 
  console.log(arguments.length); //outputs a number >= 0
  for (var i = 0; i < 3; i++) 
    console.log("Defered: ", arguments[i]);
  
);

deferreds[1].resolve("Fish2");
deferreds[2].resolve("Fish3");
deferreds[0].resolve("Fish1");
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

感谢您的回复!很好的例子。我已经阅读了文档的那部分,但我不知道它是否也适用于数组。我对 javascript 还是很陌生,所以必须确保 :)【参考方案2】:

每次回答一个问题/陈述...

$.when 解析延迟数组的顺序是否与它们在数组中的顺序相同?

没有。 $.when() 不解决传递给它的延迟/承诺。它聚合延迟/承诺,每一个都通过其他方式解决(解决或拒绝)。在这里,“聚合”意味着接受一组承诺并返回一个承诺。

我有一个未知数量的延迟数组,我试图用 $.when 来解决。

同样,$.when() 无法解析传递给它的延迟/承诺。

当所有的延迟都被解决后,'.then' 函数是否会按照我在数组中输入 then 的顺序返回已解决的延迟?

不,.then() 不会退回延期、已解决或其他方式。但是是的,它的成功回调函数(如果它触发)的参数将与原始数组一致。

deferreds[0] 是否等于 arguments[0] 而 deferreds[x] 是否等于 arguments[x]?

不,它们不会相等,但它们会对应,逐个索引。每个参数将是原始数组中相应的 deferred/promise 传递的 result

【讨论】:

以上是关于$.when 是不是以与数组中相同的顺序解析延迟数组?的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组

即使在删除某些单元格后,仍以与 TableView 单元格相同的顺序将文本字段值保存在数组中

交易取消原因是不是以与 TransactWriteItemsRequest 相同的顺序返回

本地写入是不是以与生成的顺序相同的顺序提交到 firebase

multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?

$.when 有任意数量的延迟对象? [复制]