Parse.Object.saveAll(objects)和Parse.Promise.when(promiseListOfSaves)之间的区别

时间:2015-10-07 06:55:49

标签: javascript parse-platform promise cloud-code

我有一个云代码功能,它将Notification对象标记为" read"然后立即查询同一个班级以保留"未读"对象。

问题是最多次,在我之前的未读查询中返回我标记为读取的相同Notification对象,即使这些值已在数据浏览器中更新。

当我从Parse.Promise.when()更改为Parse.Object.saveAll()时,这解决了问题,但目前仍不清楚原因。当所有save()操作完成时,应该解决when promise,因此不会运行最后的"未读"查询,直到他们被标记为已读。

Parse.Object.saveAll(objects)Parse.Promise.when(promiseListOfSaves)没有做什么?

以下每个代码示例。除了保存对象的方式之外,两者之间没有太大区别。

Parse.Cloud.define('markThreadReadAndReturnUnreadCount', function(request, response){

    var promiseChain = [];
    var Notification = Parse.Object.extend("Notification");
    qry = new Parse.Query(Notification);
    qry.equalTo('owner', request.user);
    qry.equalTo('read', false);
    qry.equalTo('messageThreadId', request.params.threadId);
    qry.find(null, {useMasterKey: true}).then(function(_notifications){
        _.each(_notifications, function(_notification){
            notification = new Notification();
            notification.id = _notification.id;
            notification.set('read', true);
            promiseChain.push(notification.save(null, {wait: true}));
        });
        return Parse.Promise.when(promiseChain);
    }).then(function(){
        var countUnreadQuery = new Parse.Query(Notification);
        countUnreadQuery.equalTo('owner', user);
        countUnreadQuery.equalTo('read', false);
        countUnreadQuery.find({useMasterKey: true}).then(function(results){
            return response.success(results.length);
        }
    };

});

使用Parse.Object.saveAll();

Parse.Cloud.define('markThreadReadAndReturnUnreadCount', function(request, response){

    var saveObjects = [];
    var Notification = Parse.Object.extend("Notification");
    qry = new Parse.Query(Notification);
    qry.equalTo('owner', request.user);
    qry.equalTo('read', false);
    qry.equalTo('messageThreadId', request.params.threadId);
    qry.find(null, {useMasterKey: true}).then(function(_notifications){
        _.each(_notifications, function(_notification){
            notification = new Notification();
            notification.id = _notification.id;
            notification.set('read', true);
            saveObjects.push(notification);
        });
        return Parse.Object.saveAll(saveObjects);
    }).then(function(){
        var countUnreadQuery = new Parse.Query(Notification);
        countUnreadQuery.equalTo('owner', user);
        countUnreadQuery.equalTo('read', false);
        countUnreadQuery.find({useMasterKey: true}).then(function(results){
            return response.success(results.length);
        }
    };

});

1 个答案:

答案 0 :(得分:2)

我不确定为什么saveAllwhen不起作用的情况下有效,但在这种情况下,我希望saveAll优于when,原因有两个:< / p>

  1. 代码风格,以下两个选项看起来更好:

    function save(objects){
        return Parse.Promise.when(objects.map(function(object){
            return object.save(null, {wait: true});
        }));
    }
    
    // or
    
    function save(objects){
        return Parse.Object.saveAll(objects);
    }
    
  2. 性能,当您使用保存数组时,您要为要保存的n对象发送n个http请求,这会浪费大量资源,但是当您使用saveAll您只发送一个请求。

  3. 我认为您的第二个代码可以简化为:

    ...
    qry.find(null, {useMasterKey: true}).then(function(_notifications){
        _.each(_notifications, function(_notification){
            notification.set('read', true);
        });
        return Parse.Object.saveAll(_notifications);
    }).then(function(){
    ...