Javascript 如何在函数返回之前等待承诺完成

Javascript 如何在函数返回之前等待承诺完成,javascript,promise,Javascript,Promise,基本承诺问题: console.log('Promise START'); 函数makeFullJSON(时间){ 返回新承诺((解决、拒绝)=>{ setTimeout(解析、时间、[time]); }) } var p1=makeFullJSON(1000); var p2=makeFullJSON(500); var p3=makeFullJSON(750); p1.然后(数组=>{ console.log('Promise 1 complete',数组); }); p2.然后(数组=>

基本承诺问题:

console.log('Promise START');
函数makeFullJSON(时间){
返回新承诺((解决、拒绝)=>{
setTimeout(解析、时间、[time]);
})
}
var p1=makeFullJSON(1000);
var p2=makeFullJSON(500);
var p3=makeFullJSON(750);
p1.然后(数组=>{
console.log('Promise 1 complete',数组);
});
p2.然后(数组=>{
console.log('Promise 2 complete',数组);
});
p3.然后(数组=>{
console.log('Promise 3 complete',数组);
});
所有([p1,p2,p3])。然后(ArrayFallResolvedValues=>{
log('解析值数组:',ArrayOfallResolvedValue);
});

console.log('Promise END')首先修复语法错误。然后将console.log移动到整个过程结束的位置:

console.log('Promise START');
函数makeFullJSON(时间){
返回新承诺((解决、拒绝)=>{
setTimeout(解析、时间、[time]);
})}
var p1=makeFullJSON(1000);
var p2=makeFullJSON(500);
var p3=makeFullJSON(750);
p1.然后(数组=>{
log('Promise 1 complete',array);});
p2.然后(数组=>{
log('Promise 2 complete',array);});//修正了这里的语法错误
p3.然后(数组=>{
log('Promise 3 complete',array);});
所有([p1,p2,p3])。然后(ArrayFallResolvedValues=>{
log('解析值数组:',ArrayOfallResolvedValue);
console.log('Promise END');

});您希望在完成后发生的任何事情都会进入您传递给的arrow函数

    console.log('Promise START');

    function makeFullJSON(time) {
       return new Promise((resolve, reject) => {
       setTimeout(resolve, time, [time]); 
    })}

    var p1 = makeFullJSON(1000);
    var p2 = makeFullJSON(500);
    var p3 = makeFullJSON(750);

    p1.then(array => {
        console.log('Promise 1 complete', array);});

    p2.then(array => {
        console.log('Promise 2 complete', array););

    p3.then(array => {
        console.log('Promise 3 complete', array);});

    Promise.all([p1, p2, p3]).then(arrayOfAllResolvedValues => {
        console.log('Array of resolved values:', arrayOfAllResolvedValues);

        console.log('Promise END');
    });

为了放弃立即执行程序,并开始编写只有在所有3个承诺都解决后才会发生的代码,正如您希望发生的那样,我建议您在代码的正下方创建一个新函数,以包含您希望在解决后发生的代码,然后像这样传递该函数:
Promise.all([p1,p2,p3])。然后(newFunctionName)
。这样你可能更容易想象它,至少在你习惯于思考它是如何精确工作的之前。

如果放置
控制台.log(“承诺结束”)
的明显答案不能让你的船浮起来,为什么不这样做呢

//didnt change anything at all above here
Promise.all([p1, p2, p3]).then(arrayOfAllResolvedValues => {
    console.log('Array of resolved values:', arrayOfAllResolvedValues);
}).then(() => {
    console.log('Promise END');
});

如果要在完成所有承诺后对操作进行排序,则必须使用
then()
进行排序,就像打印数组值时一样使用
async
/
wait

(异步()=>{
log('Promise START');
函数makeFullJSON(时间){
返回新承诺((解决、拒绝)=>{
setTimeout(解析、时间、[time]);
})}
var p1=makeFullJSON(1000);
var p2=makeFullJSON(500);
var p3=makeFullJSON(750);
p1.然后(数组=>{
log('Promise 1 complete',array);});
p2.然后(数组=>{
log('Promise 2 complete',array);});
p3.然后(数组=>{
log('Promise 3 complete',array);});
log('解析值数组:',等待承诺.all([p1,p2,p3]);
console.log('Promise END');

})();
听起来像是:。的重复。只需将Promise END
console.log
放在解析值one的旁边?
Promise.all([p1,p2,p3])。然后(()=>console.log('Promise END'))
您永远不能让Javascript中的解释器“等待”任何异步操作。相反,在任何单线程、事件驱动的系统中,您都会执行通常执行的操作—注册回调以在操作完成时收到通知,并在该回调中执行您的工作。你不用在Javascript中“等待”,谢谢大家。我同意回拨通知。这似乎是目前唯一的方法(直到我开始使用异步等待模式)啊,我没发现。指出这样的事情并在相应的位置发表评论总是好的——好的建议。谢谢大家的评论。问题是,如果上述代码位于另一个函数B调用的函数A中,该怎么办?函数B需要在调用A后完成所有承诺,才能继续。这类似于等待模式。我所知道的解决这个问题的唯一方法(无需等待)是将回调传递给函数a,并在Promise.all中调用它(正如建议的那样)。A我说得对吗?@S.Vaghar让函数A从
承诺中返回承诺。全部
?回答的第一句解释了一切。谢谢你,肯特。你救了我一天。