首页 > 解决方案 > 如何在条件字符串中使用多个 async / await 调用?

问题描述

我正在使用带有条件的 async / await :

async function validate() {
    const a = await validateA()
    const b = await validateB()
    const c = await validateC()
    return a && b && c ? true : false
}

但这似乎并不理想,因为如果 validateA 返回 false,则没有理由执行 validateB 和 validateC。

我可以像这样重写它:

async function validate() {
    const a = await validateA()
    if (!a) return false
    const b = await validateB()
    if (!b) return false
    const c = await validateC()
    return c ? true : false
}

但这对我来说很丑陋。

真的我想做这样的事情(伪代码):

async function validate() {
    return await validateA() && await validateB() && await validateC() ? true : false
}

这当然行不通,但其意图是,就像 if 语句一样,如果条件失败,则不会评估后续条件。

如何使用 async / await 正确编写此内容?

标签: javascriptasync-await

解决方案


async function validate() {
    return await validateA() && await validateB() && await validateC() ? true : false
}

这当然行不通,但其意图是,就像 if 语句一样,如果条件失败,则不会评估后续条件。

有用。

由于validateX解析一个布尔值,你可以这样写:

return await validateA() && await validateB() && await validateC();

const validateA = () => Promise.resolve(true);
const validateB = () => Promise.resolve(true);
const validateC = () => Promise.resolve(false);

async function validate() {
    return await validateA() && await validateB() && await validateC();
}

validate().then(res => console.log(res));


实现这一点的另一种方法是拒绝承诺而不是解决false.

const validateA = () => Promise.resolve();
const validateB = () => Promise.reject(); // Reject if validation fails
const validateC = () => Promise.resolve();


async function validate() {
    try {
    
      await validateA();
      await validateB(); // This will reject
      await validateC(); // This won't run
      return true; // If all validateX were resolved, return true.
      
    } catch(e) {
      return false;
    }
}

validate().then(res => console.log(res));


推荐阅读