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

Javascript: Solving the asynchronous loop to push an array in Parse.com

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

代码:

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 函数执行时运行

然后我们在 success 回调

中使用执行 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() 是这里最好的方法,但如果可行的话...