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的(异步)结果不感兴趣,所以它只是重新运行挂起的承诺
每当您想要异步函数的结果(而不是挂起的承诺)时,您应该始终
等待athen()
链的结果,在这里您可以记录最终结果,在本例中为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()
-它在这里等待,并继续使用isconsole.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
会立即执行。但是等待
只是阻塞直到异步代码完成,不是吗?