2017-09-16 77 views
0

我有一个循环调用一个函数来解析一个承诺,我需要多次调用。当所有的通话都完成后,我想处理所有的承诺结果。建立一个承诺阵列不起作用,但单个承诺做

我有一个奇怪的情况,如果我把呼叫从循环中解放出来,Promise可以解决,我可以在Promise.all块中处理它。 但是,如果我反复调用该函数并将.push插入到数组中,我会得到一个正确大小的数组,但内部没有对象。

这没有环路的作品,我可以看到在geocodeResult对象数据:

var geocodePromise = geocodeRows(parsed.data[0]); 
Promise.all([geocodePromise]).then(function([geocodeResult]) { 
    console.log("IN PROMISE: " + beautify(geocodeResult, null, 2, 80)); 
}) 
.catch(function (error) { 
    console.log("Error: " + error); 
}) 
.catch(function() { 
    console.log("Error"); 
}); 

然而,随着呼叫的循环:

var geocodeStack = []; 
for(j=0; j<parsed.data.length; j++){ 
    geocodeStack.push(geocodeRows(parsed.data[j])); 
} 
console.log(beautify(geocodeStack, null, 2, 80)); 

Promise.all([geocodeStack]).then(function([geocodeResult]) { 
    console.log("IN PROMISE: " + beautify(geocodeResult, null, 2, 80)); 
}) 
.catch(function (error) { 
    console.log("Error: " + error); 
}) 
.catch(function() { 
    console.log("Error"); 
}); 

控制台输出看起来是这样的:

IN PROMISE: [ {}, {} ] 

谁能告诉我我做错了什么?

+0

为什么你创建了两个'catch'回调?你不会在第一个“catch”回调中抛出错误,所以第二个不需要。 – alexmac

+0

此外,在第一个例子中,你不需要'Promise.all',只需使用'geocodePromise.then(...' – alexmac

+0

谢谢 - 这只是因为代码被删除以便于阅读。同意,我只是使用Promise.all都在这两个例子中,所以它是可比较的。 –

回答

3

我认为你需要Promise.all([...geocodeStack])Promise.all(geocodeStack)

你混合了两种方法,得到Promise.all([geocodeStack]),它将一个数组数组传递给你的Promise.all,而不是一个Promise数组。

+1

只需添加到答案。关键是,'geocodeStack'已经是一个数组了,所以你不需要将它包装在另一个数组中。 –

+0

@PatrickRoberts谢谢帕特里克。我在关于传递数组的阵列中添加了它 –

+0

非常感谢,我用这个撕掉了我的头发,当SO让我时,我会在几分钟内接受你的答案。 –