如何在一系列条件中使用多个async / await调用?

时间:2018-05-15 01:50:29

标签: javascript 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正确编写?

2 个答案:

答案 0 :(得分:2)

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));

答案 1 :(得分:0)

可以直接使用async / await,只要在async函数中可以预期表达式。这是一个例子:



const validateA = () => new Promise(resolve => setTimeout(resolve, 500, true));
const validateB = () => new Promise(resolve => setTimeout(resolve, 500, true));
const validateC = () => new Promise(resolve => setTimeout(resolve, 500, true));
const validateFail = () => new Promise(resolve => setTimeout(resolve, 500, false));

const validate1 = async () => await validateA() && await validateB() && await validateC();
const validate2 = async () => await validateA() && await validateFail() && await validateC();

(async () => {
  console.log('starting');
  const didValidate = await validate1();
  console.log('end, ' + didValidate + ', starting another');
  const didValidate2 = await validate2();
  console.log('end, ' + didValidate2);
})();