Javascript:在Parse.com中解决异步循环以推送数组

Javascript:在Parse.com中解决异步循环以推送数组,javascript,arrays,callback,promise,Javascript,Arrays,Callback,Promise,我想从一个循环中得到最终结果,在这个循环中,我将对象推入一个数组。我从console.log知道所有结果都进入了数组,但我无法从双循环中获得所需的数组以用于任何用途。我知道您可以使用回调或承诺,我将采用任何一种解决方案(安装了解析承诺) 守则: var arrayNames = {key: val} var val = {k: v, k1: v, k2: v} var array = []; var find= function(arrayNames) { _.mapObject(ar

我想从一个循环中得到最终结果,在这个循环中,我将对象推入一个数组。我从console.log知道所有结果都进入了数组,但我无法从双循环中获得所需的数组以用于任何用途。我知道您可以使用回调或承诺,我将采用任何一种解决方案(安装了解析承诺)

守则:

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();
}

您不能通过一些简单的重构来实现这一点吗

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);
                 }
              })
           })
         })
}
通过将
newfunc
移动到
find
函数上方,我们确保首先定义了它,并在执行
find
函数时准备就绪


然后,我们使用execute
newfunc
作为
success
回调中的函数,您需要处理
query.find()返回的承诺

假设嵌套的
\uuu0.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()
是这里最好的方法,但是如果它有效的话…

实际上,这就是我在最近的迭代中使用的方法,我将对它进行编辑以反映这一点。当我将回拨数量记录在控制台日志中时,它会将每次推送到数组,而不是一个包含所有rowsToUpdate的单个数组。为了清楚起见,newfunc应该接收一个包含所有rowsToUpdate而不是要更新的“N”行的数组,调用newfunc“N”次。