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

Javascript 在for循环中创建承诺后如何使用Promise.all(),javascript,promise,Javascript,Promise,我有一个函数foo(),它包含一个在for循环中解析的承诺。我想多次运行foo(),每次都给它不同的参数。然后我想对所有这些的结果做点什么。Promise.all()是在for循环结束时运行,还是在foo()中的所有承诺返回后运行?或者它会说“这些都不是承诺!”然后嘲笑我 var foo = (x) => { for (var i = 0; i < 100; i++) { someOtherFunctionThatReturnsAPromise(x).then

我有一个函数foo(),它包含一个在for循环中解析的承诺。我想多次运行foo(),每次都给它不同的参数。然后我想对所有这些的结果做点什么。Promise.all()是在for循环结束时运行,还是在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();
var foo=(x)=>{
对于(变量i=0;i<100;i++){
返回promise(x)的其他函数;
}
};
函数nowdeyeverything(){
返回Promise.all([foo(1)、foo(2)、foo(3)])。然后(dosomethingwhichallthosereturnedvalues());
}
现在什么都做了;
foo()是否需要返回承诺?如果是这样的话,如果foo()中的承诺是在for循环中生成的,我该怎么做呢

声明 Promise.all(iterable)方法返回一个承诺,当iterable参数中的所有承诺都已解决时,该承诺将得到解决,或者由于第一个通过的承诺被拒绝而拒绝


这段视频很好地解释了基本的承诺,但我似乎在尝试做一些架构师不打算/预期的事情。

是的,没错。这是Promise.all()的签名。:


Promise.all:(Iterable是的,没错。这是
Promise.all()的签名。

Promise.all:(Iterable是,
foo()
需要返回一个承诺。您可以将每个承诺添加到数组中,然后使用
Promise。all
等待所有承诺:

var foo = x => {
    var results = [];

    for (var i = 0; i < 100; i++) {
        results.push(
            someOtherFunctionThatReturnsAPromise(x)
                .then(returnSomething)
        );
    }

    return Promise.all(results);
};
var foo=x=>{
var结果=[];
对于(变量i=0;i<100;i++){
结果:推(
返回Promise(x)的其他函数
.然后(返回某物)
);
}
返回承诺。全部(结果);
};
是,
foo()
需要返回承诺。您可以将每个承诺添加到数组中,然后使用
promise。all
等待所有承诺:

var foo = x => {
    var results = [];

    for (var i = 0; i < 100; i++) {
        results.push(
            someOtherFunctionThatReturnsAPromise(x)
                .then(returnSomething)
        );
    }

    return Promise.all(results);
};
var foo=x=>{
var结果=[];
对于(变量i=0;i<100;i++){
结果:推(
返回Promise(x)的其他函数
.然后(返回某物)
);
}
返回承诺。全部(结果);
};

将承诺推送到数组,
foo
返回
数组,从
中的函数中省略
()
。然后()
避免立即调用函数。使用
foo()
调用中的扩展元素将承诺返回到
的单个数组。然后()
链接到
Promise.all()

var foo=(x)=>{
var-arr=[];
对于(变量i=0;i<100;i++){
arr.push(返回promise(x)的其他函数),然后(返回某物);
}
返回arr
};
函数nowdeyeverything(){
返回承诺。全部([…foo(1),…foo(2),…foo(3)])
.然后(dosomething包含所有已返回的值)
}
现在一切都好了
.catch(err=>console.log(err));

将承诺推送到数组,
foo
返回
数组,从
中的函数中省略
()
。然后()
避免立即调用函数。使用
foo()
调用中的扩展元素将承诺返回到
的单个数组。然后()
链接到
Promise.all()

var foo=(x)=>{
var-arr=[];
对于(变量i=0;i<100;i++){
arr.push(返回promise(x)的其他函数),然后(返回某物);
}
返回arr
};
函数nowdeyeverything(){
返回承诺。全部([…foo(1),…foo(2),…foo(3)])
.然后(dosomething包含所有已返回的值)
}
现在一切都好了
.catch(err=>console.log(err));

好吧,它将立即解析为
[未定义,未定义,未定义]
@Ryan Right,这一点都没有帮助。好吧,它将立即解析为
[未定义,未定义,未定义]
@Ryan Right,这一点都没有帮助。太好了,谢谢!省略号是什么(…foo(1))对于“@GlenPierce
标点符号可以是扩展元素或rest元素,具体取决于使用情况,请参阅。如果没有扩展元素,则在传递给
的数组中会有三次或N次
foo
调用数组。然后()
Promise.all()
而不是单个数组。
Promise.all([1,2,3],[4,5,6]])。然后(data=>console.log(data));Promise.all([…[1,2,3],…[4,5,6])。然后(data=>console.log(data))
。太好了,谢谢!省略号是什么(…foo(1))对于“@GlenPierce
标点符号可以是扩展元素或rest元素,具体取决于使用情况,请参阅。如果没有扩展元素,则在传递给
的数组中会有三次或N次
foo
调用数组。然后()
Promise.all()
而不是单个数组。
Promise.all([1,2,3],[4,5,6]])。然后(data=>console.log(data));Promise.all([…[1,2,3],…[4,5,6]])。然后(data=>console.log(data))
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));