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

Javascript 满足条件时执行异步函数的方便语法,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,最近,为了实现异步函数的执行,我做了一些类似的工作(异步函数1、异步函数2、异步函数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)

最近,为了实现异步函数的执行,我做了一些类似的工作(异步函数1、异步函数2、异步函数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();
编辑:修改示例以显示将结果传递给下一个并执行同步函数


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

请查看控制流库,如和。这些帮助您组织异步回调并对异步编码中的复杂流进行编码(例如,队列、内部包含异步函数的循环等)。

如果您使用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));

对于相同的

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

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

查看承诺的时间:假设您使用符合规范的承诺库,
a.then(()=>b.then(c))
应该等同于
a.then(b)。然后(c)
。如果某项操作失败,让错误传播,并在最后使用
.fail
方法捕获它。感谢您的回答,我将研究jquery承诺,因为我已经在使用jquery,它似乎足以满足我的需要。因此,这保证在启动async_2之前解决async_1,但jquery.when(异步1、异步2、异步3)不保证相同?那么我们就失去了异步函数的优势,对吗?不完全是这样,当每个异步函数都在等待之前的函数时,其他东西可以运行。我恐怕不明白你的意思;我的意思是,我确实希望函数在本地表现得像同步函数一样,但整个集群仍然是异步的同步的。比如如果我写a.then(b)。然后(c);d();,d()首先执行,这与同步函数不同。您希望第二个异步函数等待第一个异步函数,对吗?
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);