2015-06-09 78 views
0

我想從循環中將對象推入數組中的最終結果。我知道從console.log所有的結果進入數組,但我不能讓我所需的數組擺脫雙循環用於任何事情。我明白你可以使用回調或承諾,我會採取任何解決方案(解析承諾安裝)。Javascript:解決異步循環,以在Parse.com中推送數組

代碼:

var arrayNames = {key: val} 
var val = {k: v, k1: v, k2: v} 
var array = []; 
var find= function(arrayNames) { 
    _.mapObject(arrayNames, function (val, key) { 
     _.mapObject(val, function (v, k) { 
       var person = Parse.Object.extend("People"); 
       var query = new Parse.Query(person); 
       query.equalTo("name", k); 
       query.find({ 
        success: function (row) { 
        var rowsToUpdate = _.uniq(row); 
        array.push(rowsToUpdate); 
        console.log(array); 
       } 
       }) 
      }) 
     }) 
} 

var newfunc = function(array){ 
    //Do Something with the array that's full of the results from find(); 
} 

回答

0

你能不能用一些簡單的重構實現這一目標?

var newfunc = function(callback){ 
    console.log(callback);//this is now a bunch of arrays in 
    //my console log instead of a single one 
} 

var arrayNames = {key: val} 
var val = {k: v, k1: v, k2: v} 
var array = []; 

// move 'newfunc' declaration to be above 'find' 
var newfunc = function(array){ 
    //Do Something with the array that's full of the results from find(); 
    console.log(array); 
} 

var find= function(arrayNames) { 
    _.mapObject(arrayNames, function (val, key) { 
     _.mapObject(val, function (v, k) { 
       var person = Parse.Object.extend("People"); 
       var query = new Parse.Query(person); 
       query.equalTo("name", k); 
       query.find({ 
        success: function (row) { 
        var rowsToUpdate = _.uniq(row); 
        array.push(rowsToUpdate); 
        console.log(array); 

        // "callback" to 'newfunc' passing in the success results 
        newfunc(array); 
       } 
       }) 
      }) 
     }) 
} 

通過上述find功能移動newfunc,我們要確保它被定義首先,準備去當find函數執行

我們則使用success回調

+1

實際上,這就是我在最近一次迭代中使用它的方式,我將對其進行編輯以反映這一點。當我使用控制檯記錄回調數量時,它會將每次推送發送到數組,而不是一個包含所有rowsToUpdate的單個數組。爲了清楚newfunc應該接收一個包含所有rowsToUpdate而不是'N'行到upDate的單個數組,並調用newfunc'N'次。 – rashadb

0

您在執行newfunc作爲需要與query.find()返回的承諾一起工作。

假設嵌套調用_.mapObject()是正確的,那麼這樣的事情應該工作:

var find = function(arrayNames) { 
    var promises = []; 
    _.mapObject(arrayNames, function (val, key) { 
     _.mapObject(val, function (v, k) { 
      var query = new Parse.Query(Parse.Object.extend("People")); 
      query.equalTo("name", k); 
      promises.push(query.find()); 
     }); 
    }); 
    return Parse.when(promises).then(function() { 
     newfunc(_.uniq([].slice.call(arguments))); 
    }); 
} 

我不相信_.mapObject()是最好的方法,在這裏,但如果它工作...