我正在使用带有条件的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正确编写?
答案 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);
})();