像使用 setTimeout 的承诺一样使用 setTimeout 构建异步不起作用
Building async with setTimeout like a promise with setTimeout doesn't work
在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 他们说写作
async function foo() {
return 1
}
等同于写
function foo() {
return Promise.resolve(1)
}
所以这意味着如果我们想 'transform' 一个异步函数的承诺,我们必须用 return promise_result
替换 resolve(promise_result)
。
但是当我尝试将 setTimeout
与 async
一起使用时,它不起作用:
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
const test2 = () => new Promise(
(resolve, reject) => {
setTimeout(
() => resolve(25),
1000
)
}
)
const execute = async () => {
const result = await test1();
console.log(result); // undefined
}
execute();
如果我在 test2
上使用 await
,它可以工作,但在 test1
上不起作用。这是为什么 ? async/await
只是为了处理未决承诺而不使用 .then
还是我可以将 async
与 return result
一起使用而不是将 Promise
与 resolve
一起使用?
它未定义,因为 test1
没有 return 返回任何内容。仔细看看你return它在匿名函数后面
const test1 = async () => { // <--- this function returns nothing back. Nothing means "undefined"
setTimeout(
() => { // <---- you return it here back in your anonymous function witch makes no sense
return 5;
},
2000,
)
}
这很有趣。
这里的问题是
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
test1 是一个异步函数,但 setTimeout
不是。
setTimeout
将只安排您传递给它的任何内容,并立即 return 它的 timeoutID。
在这种情况下,您确实需要 手动 .
处理 Promise 代码
在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 他们说写作
async function foo() {
return 1
}
等同于写
function foo() {
return Promise.resolve(1)
}
所以这意味着如果我们想 'transform' 一个异步函数的承诺,我们必须用 return promise_result
替换 resolve(promise_result)
。
但是当我尝试将 setTimeout
与 async
一起使用时,它不起作用:
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
const test2 = () => new Promise(
(resolve, reject) => {
setTimeout(
() => resolve(25),
1000
)
}
)
const execute = async () => {
const result = await test1();
console.log(result); // undefined
}
execute();
如果我在 test2
上使用 await
,它可以工作,但在 test1
上不起作用。这是为什么 ? async/await
只是为了处理未决承诺而不使用 .then
还是我可以将 async
与 return result
一起使用而不是将 Promise
与 resolve
一起使用?
它未定义,因为 test1
没有 return 返回任何内容。仔细看看你return它在匿名函数后面
const test1 = async () => { // <--- this function returns nothing back. Nothing means "undefined"
setTimeout(
() => { // <---- you return it here back in your anonymous function witch makes no sense
return 5;
},
2000,
)
}
这很有趣。 这里的问题是
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
test1 是一个异步函数,但 setTimeout
不是。
setTimeout
将只安排您传递给它的任何内容,并立即 return 它的 timeoutID。
在这种情况下,您确实需要 手动 .