如何在sails js中获取所有函数异步的结果

时间:2018-01-12 10:14:31

标签: asynchronous sails.js

我想根据请求中作为数组传递的条件执行n个查询。我能够轮流执行所有查询,但有时在第一次查询之前执行第二次查询,因此只显示第二次查询的结果。

这是我到目前为止所做的。

var where_clauses = condition_array;
return new Promise(function (resolve, reject) {
    var counter = [];
    async.series([
        function (counterCB) {
            where_clauses.forEach(function (where_clause, i) {
                Model.count(where_clause, function (err, result) {
                    if (err) {
                        return counterCB(err);
                    }
                    console.log('result', result);
                    counter.push(result);
                    if ((where_clauses.length - 1) === i) {
                        return counterCB(null, counter);
                    }
                });
            });
        }
    ], function (err, result) {
        console.log('counter', counter);
        return err ? reject(err) : resolve(counter);
    });
});

以下是此输出。

输出1:

result 26627
result 37630
counter [ 26627, 37630 ] // This is return array

输出2:

result 37630
counter [ 37630 ] // This is return array
result 26627

现在我希望所有查询的结果都存储在数组中,而不是在我需要返回之后。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

快速解决方案只是改变您设置结束条件的方式。由于您的异步回调可能以任何顺序执行,因此您不应在“最后一次”回调之后结束,而是在您获得预期结果数之后结束。

尝试更改此内容:

ClaimsSchema

到此:

if ((where_clauses.length - 1) === i) {
    return counterCB(null, counter);
}

但是,每次要等待多个查询完成时都要设置它很困难,并且值得使用其中一个库来使其更容易。我使用Q。然后,当我想等待多个查询时,它看起来像这样:

if (counter.length >= where_clauses.length) {
    return counterCB(null, counter);
}

我大多是这样做的 - 一次启动多个查询,然后在我获得所有结果后运行一些代码......但是Q还有很多其他实用方法。

希望这有帮助!

更新

如果您需要可变数量的异步调用,可以通过将一组promises传递给Q然后使用传播回调中的var Q = require('q'); module.exports = { getLotsOfData: function(req, res) { Q.all([ User.find({flagged: true}), Group.find({flagged: true}), someOtherCustomPromise(args) ]).spread(function(users, groups, otherpromiseresult) { // do whatever you want with all three result sets return res.send({ users: users, groups: groups, otherResult: otherpromiseresult }); }).fail(function(err) { // handle the error }); }, // etc } 关键字访问结果来处理它:

arguments