满足条件时执行异步函数的方便语法

convenient syntax for executing asynchronous functions if condition is met

本文关键字:方便 语法 函数 异步 条件 执行 满足      更新时间:2023-09-26

最近,为了实现异步函数的执行(async_1,async_2,async_3必须按此顺序执行)

if(async_1_possible)
{
    async_1()
        .then(function(result_1){
            if(async_2_possible)
            {
                async_2()
                    .then(function(result_2){
                    sync(result_2);
                    async_3(result_1);
                    });
            }
            else
            {
                async_3(result_1);
            }
        });
}
else
{
    if(async_2_possible)
    {
        async_2()
            .then(function(result_2){
            sync(result_2);
            async_3();
            });
    }
    else
    {
        async_3();
    }
}

代码很快就会变得很丑…我正在寻找一个允许我这样做的语法:

if(async_1_possible){var queue += async_1};
if(async_2_possible){var queue += function(result_1){async_2();}};
if(async_3_possible){var queue += function(result_2){sync(result_2);async_3(result_1)}};
run queue();

edit:修改后的示例,以显示传递承诺结果给下一个,并执行同步函数

编辑2:查看q库,但仍然没有找到一种轻松实现上述过程的方法

请查看控制流库,如async和step。这些可以帮助你组织异步回调和编码复杂的流,这在异步编码中是地狱(例如排队,循环内部有异步函数,等等)

如果您正在使用Q,那么您可以这样做

var funcs = [];
if (async_1_possible) {
    funcs.push(async_1);
}
if (async_2_possible) {
    funcs.push(async_2);
}
if (async_3_possible) {
    funcs.push(async_3);
}
funcs.reduce(Q.when, Q(initialVal));

Q相同

的文档条目

这看起来很愚蠢,但如果你不想为承诺使用特定的库,那么它是有用的,所以我想我将它发布在这里:

var promises_string = "$.when()";
    if(async_1_possible)  
    {promises_string+=".then(function(){return async_1();})";}
    if(async_2_possible)
    {promises_string+=".then(function(result_1){return async_2();})";}
    promises_string+=".then(function(result_2){sync(result_2);
    if(sync_3_possible){return async_3;}return $.when();})";}
    etc..
eval(promises_string);

在情况下,当你需要一个结果从异步调用2步或更多之前(如async_3(result_1),这失败了,但我想写一个解析器不会太难…