在以下代码中,最后一行不打印(“结束”):
function setTimeoutSync(fn, milli) {
return new Promise((resolve) => {
setTimeout(fn, milli);
});
}
async function run () {
console.log('start');
await setTimeoutSync(() => { console.log('setTimeoutSync'); }, 3000);
console.log('end');
}
run();
并不是说脚本正在退出,因为我在await
语句之后没有执行任何操作。
NodeJS如何不执行函数中的语句?另外,在NodeJS中进行良好的老式同步等待的好方法是什么?实际上,这个问题更多地是关于前者的问题。
答案 0 :(得分:1)
不确定这是否是错字,但是您忘记了呼叫resolve
,因此await
之后的下一行将执行:
function setTimeoutSync(fn, milli) {
return new Promise((resolve) => {
setTimeout(() => {
fn()
resolve()
}, milli);
});
}
async function run() {
console.log('start');
await setTimeoutSync(() => {
console.log('setTimeoutSync');
}, 3000);
console.log('end');
}
run();
关于您的问题:
您能解释一下不调用resolve会如何导致其余的 函数未执行?...
async await使用generators和promise的行为:
异步/等待功能的目的是简化行为 同步使用promise并在组上执行某些行为 的承诺。正如承诺类似于结构化回调一样, async / await类似于组合生成器和Promise。
生成器可以yield生成结果,因此不终止执行上下文,并且可以在中断处继续执行。
基本上,您的示例可以使用Promise.prototype.then()回调编写:
function setTimeoutSync(fn, milli) {
return new Promise((resolve) => {
setTimeout(() => {
fn()
resolve()
}, milli);
});
}
async function run() {
console.log('start');
setTimeoutSync(() => {
console.log('setTimeoutSync');
}, 3000)
.then((result) => {
console.log('end');
});
}
run();
如您所见,如果我们不解决,对.then
的回调将不会运行。