我有一个函数foo(),它包含一个在for循环中解析的Promise。我想多次运行foo(),每次都给它不同的参数。然后我想对所有这些的结果做些什么。 Promise.all()会在for循环结束时运行还是在foo()内部的所有Promise都返回后运行?或者它会说"这些foo()都不是Promise!"并嘲笑我?
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()内部的Promises是在for循环中生成的,我该如何做?
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all说明了这一点 &#34; Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise。&#34;
此视频https://www.youtube.com/watch?v=RRgAdi3gX-s非常善于解释基本的Promises,但我似乎正在尝试做一些建筑师不打算/期望的事情。
答案 0 :(得分:2)
将promises推送到来自return
的数组foo
数组,省略()
内.then()
内的函数,以避免立即调用函数。在foo()
次调用时使用spread元素将单个promises数组返回到.then()
链接到Promise.all()
。
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));
答案 1 :(得分:1)
是的,没错。这是(x_circle + r * cos(angle), y_circle + r * sin(angle))
的签名:
Promise.all()
基本上,它接受一个可迭代的Promises,并返回一个Promise。
通过传递Promise.all<T>: (Iterable<Promise<T>): Promise<T[]>
的结果,foo()
预计将返回Promise本身,否则它将无效。
答案 2 :(得分:1)
是的,sudo gem install -n /usr/local/bin cocoapods
需要返回一个承诺。您可以将每个promise添加到数组中,并使用foo()
等待所有这些:
Promise.all