Javascript 使用Q使用异步调用填充数组
我有一个使用Q库异步返回值的函数。 我必须在循环中调用它,用所有结果填充数组 类似于我一直在处理的这个示例(这不是预期的效果,因为数组是在填充之前返回的)Javascript 使用Q使用异步调用填充数组,javascript,arrays,node.js,promise,q,Javascript,Arrays,Node.js,Promise,Q,我有一个使用Q库异步返回值的函数。 我必须在循环中调用它,用所有结果填充数组 类似于我一直在处理的这个示例(这不是预期的效果,因为数组是在填充之前返回的) 函数fillArray(){ var deferred=q.deferred(); var结果数组; 对于(var i=0;i
函数fillArray(){
var deferred=q.deferred();
var结果数组;
对于(var i=0;i
我已经读过,我可以使用Q.all调用几个函数,但我不知道如何在循环中调用它
谢谢你的帮助。试试这个:
function fillArray(){
var promises = [];
for(var i = 0; i < numberOfElements; i++){
promises.push(asyncFunction(i));
}
return q.all(promises);
}
function asyncFunction(number){
var deferred = q.defer();
deferred.resolve(number+1);
return deferred.promise;
}
函数fillArray(){
var承诺=[];
对于(var i=0;i
被拒绝的原因与要拒绝的第一个承诺相同。这意味着如果数组中的某些承诺被拒绝,则all
返回的承诺也会被拒绝。如果要等待解决所有原始承诺,可以使用此选项。尝试以下操作:
function fillArray(){
var promises = [];
for(var i = 0; i < numberOfElements; i++){
promises.push(asyncFunction(i));
}
return q.all(promises);
}
function asyncFunction(number){
var deferred = q.defer();
deferred.resolve(number+1);
return deferred.promise;
}
函数fillArray(){
var承诺=[];
对于(var i=0;i
被拒绝的原因与要拒绝的第一个承诺相同。这意味着,如果数组中的某些承诺被拒绝,则all
返回的承诺也会被拒绝。如果要等待所有原始承诺得到解决,则可以使用。我这样做了
fillArray().then(function(result){
console.log(result);
});
它工作正常
我从你的代码中做的唯一额外的事情就是更改
var resultsArray = [];
是我干的
fillArray().then(function(result){
console.log(result);
});
它工作正常
我从你的代码中做的唯一额外的事情就是更改
var resultsArray = [];
你不在循环中调用它。你在循环中创建一个承诺数组,然后对其应用
Q.all
。你不在循环中调用它。你在循环中创建一个承诺数组,然后对其应用Q.all
。谢谢,我也需要延迟fillArray吗?我需要做类似deferred.resolve(Q.all(promissions))的事情吗
?q.all
已经返回了一个承诺。请检查我答案中指向文档的链接。因为fillArray
正在返回调用q.all
的结果。您只需“订阅”该承诺fillArray()
太好了,我在测试这一点时又遇到了一件事。如果我需要在fillArray函数的代码的其他部分返回一个错误怎么办?例如,如果我需要执行一个延迟。拒绝(err)
在q.all…@mdlapla之前如果asyncFunction
返回的承诺中至少有一个被拒绝,那么fillArray
返回的承诺也会被拒绝。我不明白为什么您会显式地从fillArray
函数返回错误。如果fillArray
代码更改,请发布新的问题n描述您的问题,如果这回答了您的原始问题,请将其视为正确答案。@mdlapla您可以使用promise.all
或promise.allselled
与promise.spread
结合使用,以使其更简单。谢谢,我是否也需要延迟fillArray?我是否需要执行类似deferred的操作。解析(q.all(promises));
?q.all
已经返回了一个承诺。检查我答案中指向文档的链接。因为fillArray
正在返回调用q的结果。所有你需要做的就是“订阅”该承诺fillArray()。然后((resultArray)=>{/*做点什么*/})
太好了,我在测试这一点时又遇到了一件事。如果我需要在fillArray函数的代码的其他部分返回一个错误怎么办?例如,如果我需要执行一个延迟。拒绝(err)
在q.all…@mdlapla之前如果asyncFunction
返回的承诺中至少有一个被拒绝,那么fillArray
返回的承诺也会被拒绝。我不明白为什么您会显式地从fillArray
函数返回错误。如果fillArray
代码更改,请发布新的问题n描述您的问题,如果这回答了您的原始问题,请将其视为正确答案。@mdlapla您可以使用promise.all
或promise.allsolved
与promise.spread
组合使用,以使其更简单。无法保证当promises返回b时数组将完全填充yfillArray
已解析。无法保证在解析fillArray
返回的承诺时数组将完全填充。