Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行2个承诺并等待“完成()_Javascript_Promise_Q - Fatal编程技术网

Javascript 运行2个承诺并等待“完成()

Javascript 运行2个承诺并等待“完成(),javascript,promise,q,Javascript,Promise,Q,我试图同时使用promissions和Q.js运行两个不同的函数,并等待两者的响应来运行第三个操作 我想要这样的东西: run( promise1, promise2).done( callbackForBoth ); 我该怎么做呢?您可以像这样使用函数 Q.all([promise1, promise2]).then(callbackForBoth); Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {

我试图同时使用promissions和Q.js运行两个不同的函数,并等待两者的响应来运行第三个操作

我想要这样的东西:

run( promise1, promise2).done( callbackForBoth );
我该怎么做呢?

您可以像这样使用函数

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});
通常,Q.all后面跟着.spread便利方法,它将Q.all调用的结果作为函数参数进行传播,如下所示

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});
但是这个方法的问题是,如果任何承诺被拒绝,那么其余的承诺将不会被调用

因此,如果您想确保所有承诺都得到履行/拒绝,您可以在这种情况下使用

Q.allSettled([promise1, promise2]).then(callbackForBoth);
在这里,我们也可以使用spread便利方法,但粒度稍大一些。对于每个承诺,我们都会得到一个对象,该对象有一个state属性,让后续的消费者知道承诺是履行了还是拒绝了。所以,你可能想要像这样使用排列

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});
你可以像这样使用函数

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});
通常,Q.all后面跟着.spread便利方法,它将Q.all调用的结果作为函数参数进行传播,如下所示

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});
但是这个方法的问题是,如果任何承诺被拒绝,那么其余的承诺将不会被调用

因此,如果您想确保所有承诺都得到履行/拒绝,您可以在这种情况下使用

Q.allSettled([promise1, promise2]).then(callbackForBoth);
在这里,我们也可以使用spread便利方法,但粒度稍大一些。对于每个承诺,我们都会得到一个对象,该对象有一个state属性,让后续的消费者知道承诺是履行了还是拒绝了。所以,你可能想要像这样使用排列

Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});
Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});

谢谢,如果我的承诺返回每一个我需要传递给回调的结果呢?在这种情况下,callbackborboth的参数将是一个包含每个承诺结果的数组。你可以结合Q.spread来分散这些值,你可以在你的答案中写一个例子吗?谢谢,如果我的承诺返回每一个我需要传递给回调的结果呢?在这种情况下,callbackborboth的参数将是一个包含每个承诺结果的数组。你可以结合Q.spread来分散这些值,你可以在你的答案中写一个例子吗?不要这样做。两个都不要!这是一种反模式。相反,返回承诺并在调用方站点上添加一个处理程序。不要这样做。Donecallbackborboth!这是一种反模式。相反,返回承诺并在调用方站点上添加处理程序。