如何解决 for 循环中的所有承诺?
how to resolve all promises in a for loop?
还有一个关于 promises 的问题。我有这种情况:
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()
解析所有内容和 return 数组?
请试试这个:
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);
});
};
这里我们把所有的Details放到一个数组中,使用$.when.apply($, arr)等待所有的Details解析完成。完成后,每个 Details 的 return 个数据将作为一个参数传递给回调函数,因此回调函数将接收总共 data.length
个参数。然后我们使用 Array.prototype.slice.call 将所有参数转换为数组并 return 结果。
供您参考:
What does $.when.apply($, someArray) do?
How can I convert the "arguments" object to an array in JavaScript?
不需要延迟反模式(显式构造)或显式数组构造。您的代码可以简化为:
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是generally not the best idea。请考虑将构造和初始化分开。
- 您应该考虑使用本机承诺(或库)或使用支持 non problematic promises.
的 jQuery 3.0.0
还有一个关于 promises 的问题。我有这种情况:
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()
解析所有内容和 return 数组?
请试试这个:
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);
});
};
这里我们把所有的Details放到一个数组中,使用$.when.apply($, arr)等待所有的Details解析完成。完成后,每个 Details 的 return 个数据将作为一个参数传递给回调函数,因此回调函数将接收总共 data.length
个参数。然后我们使用 Array.prototype.slice.call 将所有参数转换为数组并 return 结果。
供您参考:
What does $.when.apply($, someArray) do?
How can I convert the "arguments" object to an array in JavaScript?
不需要延迟反模式(显式构造)或显式数组构造。您的代码可以简化为:
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是generally not the best idea。请考虑将构造和初始化分开。
- 您应该考虑使用本机承诺(或库)或使用支持 non problematic promises. 的 jQuery 3.0.0