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