如何在for循环中创建Promise之后使用Promise.all()

时间:2017-02-11 19:31:48

标签: javascript promise

我有一个函数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,但我似乎正在尝试做一些建筑师不打算/期望的事情。

3 个答案:

答案 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