如何通知主函数调用异步函数失败?

时间:2018-09-23 13:18:18

标签: javascript

具有验证功能,在此功能中,有三个对异步功能的调用,它们执行验证过程的独立条件,这些异步功能返回以下对象:

{status: true|false, message: void|string}

status如果验证成功,则设置为true,否则将其设置为false并添加message

要求是:validator函数必须尽早返回,也就是说,如果任何异步验证失败,则必须在此停止并在对象中返回失败的原因。

由于无法使用async/await,因此我使用回调附加了实现的仿真:

function validator() {
    validation1(response => {
        if (response.status === false) {
            console.log('Here in validation1 validator needs to return response');
        }
    });

    validation2(response => {
        if (response.status === false) {
            console.log('Here in validation2 validator needs to return response');
        }
    });

    validation3(response => {
        if (response.status === false) {
            console.log('Here in validation3 validator needs to return response');
        }
    });
}

function validation1(callback) {
    setTimeout(() => {
        const object = {
            status: random(),
            message: 'message from validation 1'
        };

        callback(object);
    }, 2000);
}

function validation2(callback) {
    setTimeout(() => {
         const object = {
             status: random(),
             message: 'message from validation 2'
         };

         callback(object);
    }, 1000);
}

function validation3(callback) {
    setTimeout(() => {
         const object = {
             status: random(),
             message: 'message from validation 3'
         };

         callback(object);
    }, 3000);
}

// Helper function for generating random boolean
const random = () => Math.random() >= 0.5;

validator();

如何通知validator函数发生错误并因此返回?

感谢您的评论。

关于这个问题,已经在question中得到解答,我认为他们没有解决相同的问题。一个问题是用javascript处理同步性和异步性,相反,这个问题询问如何处理顺序异步功能以及当这些功能中的任何一个失败时如何处理的策略。

感谢Paul对错误优先回调模式的评论,我还记得callbacks中有关javascript.info的文章。看完书后,我想到了这个解决方案。

function validatior() {
    validation1((error, success) => {
        if (error) {
            console.log(error.message);
        } else {
            validation2((error, success) => {
                if (error) {
                    console.log(error.message);
                } else {
                    validation3((error, success) => {
                        if (error) {
                            console.log(error.message);
                        } else {
                            console.log(success);
                        }
                    });
                }
            });
        }
    });
}

function validation1(callback) {
    setTimeout(() => {
        // callback(new Error('Error message from validation 1'));
        callback(null, true);
    }, 1000);
}

function validation2(callback) {
    setTimeout(() => {
        // callback(new Error('Error message from validation 2'));
        callback(null, true);
    }, 2000);
}

function validation3(callback) {
    setTimeout(() => {
        callback(new Error('Error message from vallidation 3'));
        // callback(null, true);
    }, 3000);
}

validatior();

此示例将在validation3处停止validator进程。我知道这看起来像callback hell,但是在同一篇文章中有一个有关如何缓解此问题的示例。

1 个答案:

答案 0 :(得分:1)

您可以返回一个将成功解决并在验证失败时被拒绝的promise,而不是返回false,例如:

 const timer = ms => new Promise(resolve => setTimeout(resolve, ms));

 async function validate() {
   await timer(1000);
   if(/*isValid:*/ false) {
     throw new Error("Validation failed"); // rejection
  } else {
     return true; // resolve
 }
}

然后,您可以轻松地将多个承诺变成一个:

 Promise.all([
   validate(),
   validate(),
   validate()
 ]).then(() => {
   // all fine
 }, error => {
   // at least one failed
   console.log(error.message);
 });