Javascript异步/等待程序顺序

Javascript异步/等待程序顺序,javascript,es6-promise,Javascript,Es6 Promise,const function1=()=> 新承诺(功能(解决、拒绝){ 设置超时(()=>{ 决议(10) },6000) }); const function2=async()=>{ 控制台日志(“第一”); const val=等待函数1() 控制台日志(“第二”); 返回值 } log(“第三--”,function2())尝试下一个代码 const function1 = () => new Promise(function (resolve, reject) { se

const function1=()=>
新承诺(功能(解决、拒绝){
设置超时(()=>{
决议(10)
},6000)
});
const function2=async()=>{
控制台日志(“第一”);
const val=等待函数1()
控制台日志(“第二”);
返回值
}
log(“第三--”,function2())
尝试下一个代码

const function1 = () =>
  new Promise(function (resolve, reject) {
    setTimeout(() => {
      resolve(10)
    }, 6000)
  });

const function2 = async () => {
  console.log("first");

  const val = await function1()
  console.log("second");
  return val;
}

const start = async () => {
  console.log("third -- ", await function2());
};

start();
它在日志里,伙计:)

第三个字的日志记录在第二个。因为带有单词“second”的日志在function2内部解析,function2被称为普通函数。这段代码基本上假设您对函数2的(异步)结果不感兴趣,所以它只是重新运行挂起的承诺


每当您想要异步函数的结果(而不是挂起的承诺)时,您应该始终
等待
a
then()
链的结果,在这里您可以记录最终结果,在本例中为10

您不需要调用
function2()
而需要
等待它

    await function2(); // logs first (6 seconds expire) second, 10
这是因为您需要等待函数2在继续之前解析承诺

您可以执行以下操作以获得所需的结果

    const function3 = async () => {
        const third = await function2();
        console.log( "third --", third ) 
    }
    function3();

对代码的解释

  • console.log(“第一”);-首先,我希望没有问题

  • 当解释器看到这一行时,
    const val=wait function1()
    -它在这里等待,并继续使用is
    console.log(“third--”,function2())
    执行同步代码,您可以看到
    third--Promise{}

  • 然后,解析异步部分并继续执行,最终可以看到
    console.log(“second”)

  • 要实现预期的行为,请尝试以下操作:

    const function1=()=>
    新承诺(功能(解决、拒绝){
    设置超时(()=>{
    决议(10)
    },6000)
    });
    const function2=async()=>{
    控制台日志(“第一”);
    const val=function1()
    控制台日志(“第二”);
    返回值
    }
    
    console.log(“第三--”,function2())
    您没有等待function2调用。@CharlieFish,我的理解是,当我在打印消息“first”后调用“function2”时,它应该等待“function1”被解析,然后执行消息“second”;但“function2”似乎跳过了这一步,返回了一个未解决的承诺,后来它返回并执行了消息“second”@lavender,这正是正在发生的事情,因为您没有等待(或等待)承诺解决,只是注销了未解决的承诺。我认为这段MPJ视频很好地解释了承诺中令人困惑的部分是如何工作的。谢谢你的解释@qiAlex。如果我使用了
    then
    而不是
    await
    ,则消息
    second
    会立即执行。但是
    等待
    只是阻塞直到异步代码完成,不是吗?