2014-11-20 41 views
0

我試圖從Mssql服務器中獲取一些數據。我有一個循環功能。該函數將一些數據返回給回調。我怎麼能把kriskowal的「q」的數據放到結果集變量中?在循環中使用「q」

功能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); 
    } 
}); 
}); 
+0

爲什麼不使用另一個'Q.all'? – Bergi 2014-11-20 18:23:30

+0

我使用q.all在「for(var ...」之後的第二行,或者是否存在一個解決方案? – poldixd 2014-11-20 20:50:44

回答

0

你在某些點結構仍像一個同步的方法。我試着以下更改:

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()是異步以及和應該受到同樣的對待。所以在我的代碼中,我得到了這些子查詢的結果,並將它們結合到一個新的延遲/承諾中。當所有這些子查詢承諾全部滿足時,可以用相應的結果執行主回調。

+0

爲什麼用for ... in循環迭代一個數組?爲什麼回調? – 2014-11-20 19:24:53

+0

@BenjaminGruenbaum這兩個OP代碼的一部分都沒有改變。 – Sirko 2014-11-20 19:34:06