如何解析for循环中的所有承诺
how to resolve all promises in a for loop?
又是一个关于承诺的问题。我有这样一个场景:
Service.prototype.parse = function (data) {
var deferred = $.Deferred();
var arr = [];
for (var i = 0; i < data.length; i++) {
var details = new Details();
$.when(details).then(function (data) {
arr.push(data);
deferred.resolve(arr);
});
}
return deferred.promise;
};
在代码的其他地方:
...
$.when(parse()).then(function (resp) {
//...
});
承诺在某个点得到解决,但最初resp
的长度为1。
如何等待parse()
解决一切并返回一个数组?
不需要延迟的反模式(显式构造)或显式数组构造。您的代码可以简化为:
Service.prototype.parse = function (data) {
return $.when.apply($, data.map(function(x){
return new Details();
}).then(function(){ return arguments; });//.then(Array.of); // instead, if want array
};
一般建议:
- 你忽略了你在数据中迭代的项目,我假设你在实际代码中不会这样做,但只是确保。 在构造函数中执行异步IO通常不是最好的主意。请考虑将构造和初始化分开。
- 你应该考虑使用原生承诺(或库)或使用jQuery 3.0.0,它支持无问题的承诺。
请试试:
Service.prototype.parse = function(data) {
var detailsArr = [];
for (var i = 0; i < data.length; i++) {
var details = new Details();
detailsArr.push(details);
}
return $.when.apply($, detailsArr).then(function(){
return Array.prototype.slice.call(arguments);
});
};
这里我们把所有的细节放到一个数组中,使用$.when。apply($, arr)等待所有细节得到解析。完成后,每个Details的返回数据将作为一个参数传递给回调函数,因此回调函数将接收总data.length
个数的参数。然后使用array .prototype.slice.call将所有参数转换为数组并返回结果。
供参考:
$.when。apply($, someArray) do?
如何转换"参数"?对象数组在JavaScript?
相关文章:
- 延期承诺值未更新/解析/延期
- 如何使失败的路由解析承诺加载不同的模板URL
- AngularJS因果报应测试规范承诺未解析,且未调用.then()
- 在同一函数中解析承诺后返回承诺
- AngularJS:根据值解析承诺对象
- 尝试编写承诺时出错:承诺解析器对象不是函数
- 如何在恢复函数之前等待 JavaScript 承诺解析
- 解析承诺'当'返回undefined(Javascript)
- 按照承诺,通过与chai的函数调用验证已解析承诺的内容
- 在循环中解析所有承诺后返回值
- 是否可以将已解析的承诺分配给对象的属性
- 请给我看一下解析承诺的基本模式
- 是否可以覆盖本机 Es6 承诺解析方法
- 角度承诺未正确解析
- 的承诺.如何获得所有承诺的解析值
- 如何在ClojureScript中绑定Javascript承诺的解析值
- angular承诺的解析顺序和它们发送的顺序一样吗?
- Angular:在我在控制器中设置返回值之前,我怎么能等待服务中的承诺被解析呢?
- 在EmberJs中,只有在父路由返回的承诺被解析后,才让子路由触发模型钩子
- 承诺在解析时抛出未处理的错误