最近,我最终在这些方面做了一些事情来实现异步函数的执行(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库,但仍然看不到实现上述过程的无痛方法
答案 0 :(得分:1)
答案 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));
答案 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),则会失败,但我想编写解析器不会太难......