Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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 承诺中Console.log()的奇怪行为_Javascript_Promise_Console.log - Fatal编程技术网

Javascript 承诺中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(

因此,我正在做一些关于承诺的工作,当我使用承诺中的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');
}); 
  • “第一次呼叫”
  • “在承诺中”
  • “离开第二个承诺”
  • “离开第三个承诺”
  • “第二次呼叫”
  • “在承诺中”
  • “第三次呼叫”
  • “在承诺中”
主要问题 为什么JavaScript在promise中一次似乎不按顺序读取代码行?它看起来就像是先通过控制台日志记录,然后返回代码并执行承诺在.then方法之后执行的函数。如有任何见解,将不胜感激

doSomething("2nd Call");
console.log('leaving 2nd promise'); 
Do something是异步的,需要
~1000
m/s才能完成执行。所以,当
doSomething(“第二次呼叫”)时,您的代码跳入方法,返回承诺,并开始
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实例。