Javascript承诺等待解释

Javascript承诺等待解释,javascript,promise,async-await,Javascript,Promise,Async Await,我只想了解承诺和等待是如何协同工作的。请看以下代码: console.log("One: Started"); setTimeout(function(){console.log("One: Completed")}, 1000); console.log("Two: Started"); setTimeout(function(){console.log("Two: Completed")}, 2000); console.log("Three: Started"); setTimeout(f

我只想了解承诺和等待是如何协同工作的。请看以下代码:

console.log("One: Started");
setTimeout(function(){console.log("One: Completed")}, 1000);
console.log("Two: Started");
setTimeout(function(){console.log("Two: Completed")}, 2000);
console.log("Three: Started");
setTimeout(function(){console.log("Three: Completed")}, 3000);
因此,这当然会记录:

One: Started
Two: Started
Three: Started
One: Completed
Two: Completed
Three: Completed
我想在下一个开始之前完成这个。我写这篇文章是因为我理解了承诺和等待,但这不起作用。请有人尝试编辑此代码以使其正常工作请给我一个解释,因为我正在努力理解承诺并等待

async function LogAll() {
    console.log("One: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("One: Completed");
                resolve();
            }, 1000);
        });
    }
    console.log("Two: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("Two: Completed");
                resolve();
            }, 2000);
        });
    }
    console.log("Three: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("Three: Completed");
                resolve();
            }, 3000);
        });
    }
}

LogAll();

你需要等待承诺,而不仅仅是功能。当您
等待函数…
(不调用它)时,函数将作为表达式求值,然后被丢弃。只需调用以下函数:

异步函数LogAll(){ console.log(“一:启动”); 等待(函数){ 返回新承诺((解决、拒绝)=>{ setTimeout(函数(){ 控制台日志(“一个:已完成”); 解决(); }, 1000); }); })(); log(“两个:已启动”); 等待(函数){ 返回新承诺((解决、拒绝)=>{ setTimeout(函数(){ 控制台日志(“两个:已完成”); 解决(); }, 2000); }); })(); log(“三:启动”); 等待(函数){ 返回新承诺((解决、拒绝)=>{ setTimeout(函数(){ 控制台日志(“三:已完成”); 解决(); }, 3000); }); })(); }
LogAll()异步函数的
声明定义了一个
异步函数
,该函数返回一个AsyncFunction对象

async函数
可以包含一个
wait
表达式,该表达式暂停执行
async函数
并等待传递的
Promise的
解析,然后恢复
async函数的
执行并返回解析值

函数resolveAfter2Seconds(){
返回新承诺(解决=>{
设置超时(()=>{
决议(“调用”);
}, 2000);
});
}
异步函数asyncCall(){
var result=等待resolveAfter2Seconds();
控制台日志(结果);
//预期产出:“已解决”
log('called');
}

异步调用()什么是异步函数:

它是一个返回AsyncFunction对象的函数,类似于Promissions。如果抛出错误,对象将拒绝,否则当返回值时,对象将解析

异步函数是较新的,在它们存在之前,有不同的方法来编写异步代码:承诺(rxjs的一部分)、可观察(“无限承诺”)、用于计时事件的回调

等待关键字是什么:

在Javascript中,
await
关键字只能在具有以下语法的
async
函数中使用:

[returnValue]=等待表达式

其中表达式可以是承诺或异步代码返回的任何其他值

wait
告诉代码停止并等待该值

否则,上述表达式中的
returnValue
将立即被赋予一个值(很可能是未定义的),并且代码将在不阻塞的情况下继续。在代码中经过一些未知时间和未知点后,函数将最终返回,
returnValue
将最终收到正确的值。但是,可能代码向前推进,错误地假设您已经定义并更新了值,可能会失败

尝试在不使用async Wait的情况下运行代码段。它们是显示相应同步代码的反例:

示例1:所有承诺立即开始

函数LogAll(){
console.log(“一:启动”);
新承诺((解决、拒绝)=>{
setTimeout(函数(){
控制台日志(“一个:已完成”);
解决();
}, 1000);
});
log(“两个:已启动”);
新承诺((解决、拒绝)=>{
setTimeout(函数(){
控制台日志(“两个:已完成”);
解决();
}, 2000);
});
log(“三:启动”);
新承诺((解决、拒绝)=>{
setTimeout(函数(){
控制台日志(“三:已完成”);
解决();
}, 3000);
});
}

LogAll()非常感谢!这太完美了。对不起,我的问题是XD,但这教会了我很多!只需添加
()之后的code>等待调用它们并返回承诺。您不需要将整个函数括起来。你也可以看看