我有下面的testAsync函数,它应该在调用resolve()
后返回解析的promise。
async function wait(time) {
await new Promise((resolve, reject) => { setTimeout(resolve, time) });
}
async function testAsync(testParam) {
return new Promise(async (resolve, reject) => {
try {
await wait(2000); // do some async work
if (testParam === 1) {
console.log("test param is equal to 1");
resolve("first IF");
}
if (testParam < 10) {
console.log("test param is smaller than 10");
resolve("second IF");
}
} catch (error) {
reject(error);
}
});
}
(async () => {
let result = await testAsync(1);
console.log(result);
})();
控制台输出:
test param is equal to 1
test param is smaller than 10
first IF
我的问题是,如果我以一种包括更多对resolve()
的非独占调用的方式来构建代码,那么代码确实解决了它命中的第一个调用,但它不会在那个地方停止并返回。为什么会继续?resolve()
不是松散地等于return
吗?我应该在每次调用resolve()
之后添加return
吗?
return new Promise(async (resolve, reject) => {
是反模式。在函数前面添加async
将已经返回Promise。new Promise
必须仅用于将基于none Promise的异步函数转换为使用Promise的函数。
resolve((是否不松散地等于return?
它只是在某种意义上相等,即它设置了promise的"return"值,但它不会破坏执行流。因此,如果您想防止执行后续代码,则需要在解析后放置return
。
但正如我已经说过的,所示的结构无论如何都是反模式的,testAsync
应该是这样的:
async function testAsync(testParam) {
await wait(2000); // do some async work
if (testParam === 1) {
console.log("test param is equal to 1");
return "first IF";
}
if (testParam < 10) {
console.log("test param is smaller than 10");
return "second IF";
}
}
wait
更有可能是这样写的:
function wait(time) {
return new Promise((resolve, reject) => { setTimeout(resolve, time) });
}