我有一个foo()函数,它包含一个在for循环中解析的Promise。我想多次运行foo(),每次都给它不同的参数。然后我想用所有这些结果做点什么。Promise.all()是在for循环结束时运行,还是在foo()内部的所有Promises返回之后运行?或者它会说“这些foo()都不是承诺!”嘲笑我?
var foo = (x) => {
for (var i = 0; i < 100; i++) {
someOtherFunctionThatReturnsAPromise(x).then(returnSomething());
}
};
function nowDoEverything() {
return Promise.all([foo(1), foo(2), foo(3)]).then(doSomethingWithAllThoseReturnedValues());
}
nowDoEverything();
foo()需要返回一个Promise吗?如果是这样的话,如果foo()中的Promise是在for循环中生成的,我该如何做呢?
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all声明“Promise.all( iterable )方法返回一个promise,当iterable参数中的所有promise都已解析时,该promise将解析,或者以第一个传递的promise拒绝的原因拒绝。”
这个视频https://www.youtube.com/watch?v=RRgAdi3gX-s真的很擅长解释基本的承诺,但我似乎试图做一些架构师没有打算/期望的事情。
发布于 2017-02-11 19:40:11
推送承诺到一个数组,来自foo
的return
数组,在.then()
内的函数中省略()
,以避免立即调用函数。在foo()
调用中使用扩展元素将promises的单个数组返回给链接到Promise.all()
的.then()
。
var foo = (x) => {
var arr = [];
for (var i = 0; i < 100; i++) {
arr.push(someOtherFunctionThatReturnsAPromise(x).then(returnSomething));
}
return arr
};
function nowDoEverything() {
return Promise.all([...foo(1), ...foo(2), ...foo(3)])
.then(doSomethingWithAllThoseReturnedValues)
}
nowDoEverything()
.catch(err => console.log(err));
发布于 2017-02-11 19:37:46
是的,这就对了。这是Promise.all()
的签名
Promise.all<T>: (Iterable<Promise<T>): Promise<T[]>
基本上,它接受一个可迭代的承诺,并返回一个承诺。
通过传递foo()
的结果,预计foo()
本身将返回一个Promise,否则它将无法工作。
发布于 2017-02-11 19:37:57
是的,foo()
需要返回一个承诺。您可以将每个promise添加到一个数组中,并使用Promise.all
等待所有它们:
var foo = x => {
var results = [];
for (var i = 0; i < 100; i++) {
results.push(
someOtherFunctionThatReturnsAPromise(x)
.then(returnSomething)
);
}
return Promise.all(results);
};
https://stackoverflow.com/questions/42180299
复制相似问题