之前对于Promise相当不了解,同步等待函数都是用的其他的库,后面发现es原生的Promise其实完全可以支持同步等待操作,以此记录,希望后面人少走弯路。
promise
Promise的参数是一个函数,函数就是要等待执行的什么内容,这个函数的参数有两个,一个是resolve,一个是reject。通过主动调用resolve就可以控制promise的结束。
Promise(funciton(resolve, reject){
resolve();
})
async/await
es6有了一个新的关键字 await/async,可以达到编写同步代码的目的。比如等待时间到了执行后面的内容就可以写成
async waitOneSecondToExe(){
await setTimeout(function(){}, 1000);
doSomething();
}
await同步等待的内容是一个Promise对象,当然不是Promise对象await也不会报错,但是也没有任何作用了。
同步等待一个回调函数
await一个函数好理解,但是await一个回调函数怎么办呢。我现在想等待websocket返回结果再执行后面的内容如何做呢?
//socket接收到数据然后执行doSomething
function recvData(){
socket.on("recvData", function(data){
console.log(data);
});
doSomething();
}
如上面的代码肯定是不行的,recvData中的socket.on函数仅仅是进行了注册,我的期待是doSomething在socket接收到数据后才执行,那么怎么办呢?
async function recvData(){
await new Promise((resolve) =>
{
socket.on("recvData", function(data){
console.log(data);
resolve();
})
});
doSomething();
}
通过主动调用resolve函数,会把Promise内部的状态设置为已完成,await等待的Promise就会得到结果,执行下面的程序内容。达到同步等待会调函数的目的