Javascript 承诺中Console.log()的奇怪行为
因此,我正在做一些关于承诺的工作,当我使用承诺中的console.log()时,会出现一些奇怪的行为 代码Javascript 承诺中Console.log()的奇怪行为,javascript,promise,console.log,Javascript,Promise,Console.log,因此,我正在做一些关于承诺的工作,当我使用承诺中的console.log()时,会出现一些奇怪的行为 代码 function doSomething(msg){ return new Promise( (myresolve, myreject) => { setTimeout( () => { console.log(msg); console.log(
function doSomething(msg){
return new Promise(
(myresolve, myreject) => {
setTimeout(
() => {
console.log(msg);
console.log('In the promise')
myresolve();
},
1000);
});
}
doSomething("1st Call")
.then(function() {
doSomething("2nd Call");
console.log('leaving 2nd promise');
})
.then(function() {
doSomething("3rd Call");
console.log('leaving 3rd promise');
});
输出到控制台
function doSomething(msg){
return new Promise(
(myresolve, myreject) => {
setTimeout(
() => {
console.log(msg);
console.log('In the promise')
myresolve();
},
1000);
});
}
doSomething("1st Call")
.then(function() {
doSomething("2nd Call");
console.log('leaving 2nd promise');
})
.then(function() {
doSomething("3rd Call");
console.log('leaving 3rd promise');
});
- “第一次呼叫”
- “在承诺中”
- “离开第二个承诺”
- “离开第三个承诺”
- “第二次呼叫”
- “在承诺中”
- “第三次呼叫”
- “在承诺中”
doSomething("2nd Call");
console.log('leaving 2nd promise');
Do something是异步的,需要~1000
m/s才能完成执行。所以,当doSomething(“第二次呼叫”)最初调用code>时,您的代码跳入方法,返回承诺,并开始setTimeout
。然后,将记录“离开第二个承诺”
。稍后,我们之前通过调用doSomething(“第二次调用”)
启动的setTimeout将完成,因此它将“第二次调用”
记录到控制台。要等待您对doSomething(“第二次调用”)
的初始调用完成,您需要对它返回的承诺使用。然后()
(或等待
),这样您可以在承诺解决时执行代码:
函数doSomething(msg){
回报新的承诺(
(myresolve,myreject)=>{
设置超时(
() => {
控制台日志(msg);
console.log('在承诺中')
myresolve();
},
1000);
});
}
doSomething(“第一次呼叫”)
.然后(()=>doSomething(“第二次呼叫”))
.然后(()=>console.log('leaving second promise'))
.然后(()=>doSomething(“第三次呼叫”))
.然后(()=>console.log('leaving third promise')代码>这是我希望看到的输出。为了帮助回答您的问题,您能否明确列出您期望的确切输出,以便我们可以解释差异?我认为您没有考虑超时造成的延迟。另外,日志中的短语离开第二个承诺
和离开第三个承诺
并不准确。它们位于附加到第一个承诺的.then()
回调中。他们不依赖于执行第二和第三个承诺。第二次和第三次承诺只会导致显示承诺中的2nd call
/3rd call
和。setTimeout中的代码要到稍后才会运行-订单没有问题-。。。如果将var ret=doSomething('2nd Call')
和ret
放在console.log('leaving…
)之后('leaving…
),您将更接近您期望的订单,这是您设置的延迟所期望的。如果您立即解决它,您可以看到它正确地保持订单。如果,则()
callbacks返回了从doSomething()返回的Promise实例。
。