【问题标题】:Use "q" inside a loop在循环中使用“q”
【发布时间】:2015-01-18 15:00:24
【问题描述】:

我正在尝试从 Mssql 服务器中获取一些数据。我有一个带循环的函数。该函数将一些数据返回给回调。如何将 kriskowal 的“q”中的数据放入 resultset 变量中?

pet.getNameByIDadress.getNameByID 函数将数据返回到回调!

感谢您的帮助!

尼尔斯你好

exports.get = function(callback) {
edge.func("sql", {
    source: 'SELECT * FROM people'
})(null, function(error, result) {
    if (error) {
        throw (error)
    }

    if (result) {

        var resultset = []

        for (var i in result) {

            var row = result[i];

            q.all([
                // get pet name
                q.fcall(function() {
                    var deferred = q.defer();
                    pet.getNameByID({
                        id: 32155
                    }, function(data) {
                        deferred.resolve(data);
                    });
                    return deferred.promise;
                }),
                // get adress
                q.fcall(function() {
                    var deferred = q.defer();
                    adress.getNameByID({
                        id: 23
                    }, function(data) {
                        deferred.resolve(data);
                    });
                    return deferred.promise;
                }),
            ]).spread(function(resultPet, resultAdress) {

                // Data!!!!
                return {
                    petData: resultPet,
                    adressData: resultAdress
                };

            });

            resultset.push( /* How can i push the data return from spread() into the resultset array? */ )
        }

        callback(resultset);
    }
});
});

【问题讨论】:

  • 你为什么不使用另一个Q.all
  • 我在 "for (var..." 之后的第二行使用 q.all。或者有更好的解决方案吗?

标签: javascript node.js callback promise q


【解决方案1】:

您的结构在某些方面仍然看起来像同步方法。我尝试在下面进行更改:

exports.get = function(callback) {
edge.func("sql", {
    source: 'SELECT * FROM people'
})(null, function(error, result) {
    if (error) {
        throw error;
        return;
    }

    if (result) {

        var subresults = [];

        for (var i=0; i<result.length; i++) {

            var row = result[i];

            // defers for the results of the subqueries
            var petResult = q.defer(),
                adressResult = q.defer();

            // 1st subquery
            pet.getNameByID({
                id: 32155
            }, function(data) {
              petResult.resolve(data);
            });

            // 2nd subquery
            adress.getNameByID({
                id: 23
            }, function(data) {
                adressResult.resolve(data);
            });

            // collect both subquerys and add a promise for
            var subqueries = q.all( petResult.promise, adressResult.promise )
                                .then( function( pet, adress ){
                                  return {
                                    petData: pet,
                                    adressData: adress
                                  }
                                }, function( e ){ 
                                  return e 
                                });

            // collect all subresults
            subresults.push( subqueries );
        }

        // when all queries are resolved
        q.all( subresults )
         .then( function(){
          // all results will be in the arguments array here
          callback( arguments );
         }, function( e ) {
           // some error handling
         });

    }
});
});

adress.getNameByID()pet.getNameByID() 的调用也是异步的,应该这样处理。所以在我的代码中,我得到了这些子查询的结果,并将它们组合成一个新的延迟/承诺。当所有这些子查询承诺都得到满足时,可以执行带有相应结果的主回调。

【讨论】:

  • 为什么用 for... in 循环迭代数组?另外,为什么要回调?
  • @BenjaminGruenbaum 两者都只是我没有更改的 OP 代码的一部分。
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2023-03-22
  • 2019-04-14
  • 2014-10-15
相关资源
最近更新 更多