首页 > 解决方案 > Promise 中的多个 resolve() 调用返回异步函数

问题描述

我有以下 testAsync 函数,它应该在我调用resolve().

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?我应该return在每次resolve()通话后添加吗?

标签: javascriptnode.jspromise

解决方案


return new Promise(async (resolve, reject) => {是反模式。在函数前面添加async将已经返回一个 Promise。new Promise只能用于将无 Promise 基本异步函数转换为使用 Promise 的函数。

resolve() 不是松散地等于返回吗?

它只是在某种意义上是相等的,它设置了 Promise 的“返回”值,但它不会破坏执行流程。所以是的,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) });
}

推荐阅读