我正在尝试从API调用的输出创建一个数组。所有API调用都基于条件。我试过下面的代码。
var a = true;
var b = false;
var c = true;
var result = [];
if(a)
{
callApi("a", function(data){
result.push(data); //data = this is a
})
}
if(b)
{
callApi("b", function(data){
result.push(data); //data = this is b
})
}
if(c)
{
callApi("c", function(data){
result.push(data); //data = this is c
})
}
console.log(result);
输出应为
["this is a", "this is c"];
" B"不应该来这里,因为条件是假的。
但它显示空白数组,因为它不等待回调。
[]
如何让整个过程同步?
答案 0 :(得分:1)
如何让整个过程同步?
你绝对不能也应该忘掉它。你有一个异步函数列表,一旦所有异步函数都执行完毕,你应该使用它们的结果。这就是异步功能的工作方式。
所以有一种可能性是使用promisify your callapi
function模块q
:
function promisify(arg) {
var deferred = Q.defer();
callApi(arg, function(data) {
deferred.resolve(data);
});
return deferred;
}
既然你已经做到了,事情就变得容易了:
var a = true;
var b = false;
var c = true;
var promises = [];
if (a) {
promises.push(promisify('a'));
}
if (b) {
promises.push(promisify('b'));
}
if (c) {
promises.push(promisify('c'));
}
现在您已经获得了promises数组,就像等待所有这些数据得到解决一样简单,只需使用结果:
Q.allSettled(promises).then(function(results) {
// TODO: do something with the results here
console.log(results);
});
答案 1 :(得分:0)
https://github.com/caolan/async
async.series([
function(callback){
// do some stuff ...
callback(null, 'one');
},
function(callback){
// do some more stuff ...
callback(null, 'two');
}
],
// optional callback
function(err, results){
// results is now equal to ['one', 'two']
});
你也可以选择并行处理或连续处理
在每个函数中,如果是逻辑,则可以放置ur,如果为true则执行回调(null,res)并将其推送到结果数组,如果为false则执行回调(null,null)