【问题标题】:Query Inside Parse Cloud For Loop在 Parse Cloud 中查询 For 循环
【发布时间】:2015-08-14 09:59:34
【问题描述】:

我已经尝试运行 Parse Cloud Code 一段时间了,但似乎无法解决这个问题:

我有一个名为 IDArray 的 Parse objectId 数组。然后我将数组作为PFCloud 调用的参数发送。将数组发送到云代码后,我无法似乎成功创建了一个 for loop,该 for loop 会通过并更新存储为 Parse 上“点”的数值以供 each objectId.

简而言之,这就是我想要完成的全部工作:

  • 我只需要能够让for loop 通过每个 objectId 并为每个 ID 执行一个操作。

我一直试图让它工作一段时间,但没有运气。这是我一直试图操纵的代码 - 希望它能给某人一个回答我的问题的起点。

Parse.Cloud.define('updateAllUsers', function(request, response) {
    var UserData = Parse.Object.extend('UserData');
    var query = new Parse.Query(UserData);
    var list = request.params.listID;
    var currentuser = request.params.user;

                   
    for (var i = 0; i < list.length; i++) {
                   
        var userdata = list[i];        
        query.get(userdata, {
                                       
            success: function(UserData) {
                               
                response.success('Should add up');
                UserData.addUnique('Done', +1);
                UserData.save();
            },
            error: function() {
                response.error('something went wrong' );
            }
        });
    }
});

如果有人能帮我解决这个问题,我将不胜感激。谢谢

【问题讨论】:

  • request.params.listID 在运行时的值是多少?你会走error 路径吗?
  • “listID”的值是一个包含 Parse objectId 的数组。这是我在 NSLog 中收到的错误:[错误]:错误:无法多次调用成功/错误
  • @KevinBoucher 不太确定从这里去哪里。我一直在尝试使用 Promise 来实现它,但我似乎无法做到这一点
  • 我认为这是因为您一遍又一遍地使用相同的Parse.Query。将 query 赋值移动到循环中。
  • 如何将查询分配放入循环中?

标签: javascript jquery parse-platform promise parse-cloud-code


【解决方案1】:

我认为问题是您多次发送响应,您应该等待所有承诺完成然后发送响应:

Parse.Cloud.define('updateAllUsers', function(request, response) {
    var UserData = Parse.Object.extend('UserData');
    var query = new Parse.Query(UserData);
    var list = request.params.listID;
    var currentuser = request.params.user;

    function checkUserData(userdata){   // returns parse promise for a particular userdata
        return query.get(userdata).then(function(){
            UserData.addUnique('Done', +1);
            UserData.save();            
        });
    }

    Parse.Promise.when(list.map(checkUserData)) // mapping all the elements in the list to resp promises
        .then(function(){   // on success
            response.success('Should add up');
        }).catch(function(e){    // on failure
             response.error('something went wrong' );
        });
});

编辑:如果由于某种原因 map 不可用(如果是旧版浏览器或 list 不是普通的 javascript 数组),您可以执行以下操作:

Parse.Cloud.define('updateAllUsers', function(request, response) {
    var UserData = Parse.Object.extend('UserData');
    var query = new Parse.Query(UserData);
    var list = request.params.listID;
    var currentuser = request.params.user;
    var promises = [];
    function checkUserData(userdata){   // returns parse promise for a particular userdata
        return query.get(userdata).then(function(){
            UserData.addUnique('Done', +1);
            UserData.save();            
        });
    }

    for(var i=0;i<list.length;i++){
        promises.push(checkUserData(list[i]));
    }


    Parse.Promise.when(promises) // once all the promises are resolved...
        .then(function(){   // on success
            response.success('Should add up');
        }).catch(function(e){    // on failure
             response.error('something went wrong' );
        });
});

【讨论】:

  • 感谢您迄今为止的帮助。我对这个很陌生,对我来说太赤裸裸了,哈哈。所以这将采用“n”个项目(它们都是来自“listID”的所有objectId)并为这n个项目创建承诺?我对这将如何分别循环遍历每个项目感到困惑。但是我确实尝试使用它但收到了这个:[错误]:找不到函数(代码:141,版本:1.7.5)
  • 是的,我将列表创建为 NSArray。目前它有 4 个测试 objectId 值,但稍后它需要是一些数字才能工作
  • 我正在从我的 xcode 项目中提取列表数组 - 不确定这是否清楚或是否改变了一些事情
  • @WillVonUllrich 你可以试试我的第二个选项,没有map,同时在整个地方喷洒console.log 可能会更清楚地知道错误来自哪里
  • 好的。最后一个问题:checkUserData 函数 - 在 for 循环之后与 Parse.Promise... 一起工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多