如何根据条件在Nodejs中进行同步调用

时间:2015-10-17 11:56:39

标签: javascript node.js asynchronous

我正在尝试从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"不应该来这里,因为条件是假的。

但它显示空白数组,因为它不等待回调。

[]

如何让整个过程同步?

2 个答案:

答案 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)