如果满足条件,则执行异步函数的方便语法

时间:2014-07-09 05:10:56

标签: javascript asynchronous promise

最近,我最终在这些方面做了一些事情来实现异步函数的执行(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();

编辑:修改示例以显示将promises传递给下一个并执行同步函数

编辑2:看了q库,但仍然看不到实现上述过程的无痛方法

3 个答案:

答案 0 :(得分:1)

请查看控制流库,例如asyncstep。这些可以帮助您组织异步回调和编码异步编码中的复杂流程(例如排队,内部具有异步功能的循环等)

答案 1 :(得分:1)

如果你正在使用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 Documentation entry用于相同的

答案 2 :(得分:0)

这看起来很愚蠢,但如果您不想使用特定的图书馆进行承诺会有所帮助,所以我想我会在这里发布:

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),则会失败,但我想编写解析器不会太难......