在下面的代码中,最后一行不打印('end'):
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 中进行老式同步等待的好方法是什么?这个问题实际上更多的是关于前者而不是后者。
不确定这是否是一个拼写错误,但您忘记调用 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();
关于你的问题:
Can you explain how not calling resolve can result in the rest of the
function not executing?...
嗯async await使用 generators和 promise行为:
The purpose of async/await functions is to simplify the behavior of
using promises synchronously and to perform some behavior on a group
of Promises. Just as Promises are similar to structured callbacks,
async/await is similar to combining generators and promises.
发电机可以 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
的回调将不会运行。