【问题标题】:Javascript: Solving the asynchronous loop to push an array in Parse.comJavascript:解决异步循环以在 Parse.com 中推送数组
【发布时间】:2015-08-23 17:27:06
【问题描述】:

我想从将对象推入数组的循环中获得最终结果。我从 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();
}

【问题讨论】:

    标签: javascript arrays callback promise


    【解决方案1】:

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

    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

    【讨论】:

    • 实际上,这就是我在最新迭代中的方式,我将对其进行编辑以反映这一点。当我控制台记录回调数量时,它会将每个推送发送到数组,而不是发送一个包含所有 rowsToUpdate 的数组。需要明确的是,newfunc 应该接收一个包含所有 rowsToUpdate 的数组,而不是要更新的 'N' 行,调用 newfunc 'N' 次。
    【解决方案2】:

    您需要使用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() 是这里最好的方法,但如果它有效......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多