2015-10-07 78 views
2

之间的区别我有一个云代码函数,它将Notification对象标记为“read”,然后立即查询同一个类,以便保留“未读”对象。Parse.Object.saveAll(objects)和Parse.Promise.when(promiseListOfSaves)

问题是大多数次,即使数据浏览器中的值已更新,我标记为已读的通知对象也会返回到我先前的未读查询中。

当我从Parse.Promise.when()更改为Parse.Object.saveAll()时,解决了这个问题,但它仍然不清楚原因。当所有的save()操作完成时应该解决何时应答,因此在被标记为已读之前不会运行最后一个“未读”查询。

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

}); 

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

}); 
+0

我做了一些副本编辑大多只是打破了一个长款分成多个段落更好的可读性,在尝试的精神确保你在这里得到一个很好的答案。 (顺便说一下,欢迎使用StackOverflow。) – sideshowbarker

+0

@Tariq,我想你需要将第二块代码更新为Object.saveAll – mido

+0

谢谢@ mido22。更新 –

回答

2

我不知道为什么saveAll作品,其中when不工作,但我想在这种情况下更喜欢saveAll超过when的原因有两个:

  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. 性能,当你使用存储阵列,您发送:下面的两个选项http请求要保存的n对象,这是一个巨大的资源浪费,但是当您使用saveAll时,您只发送一个请求来请求所有对象。

我也想你第二个代码可以简化为:

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

我认为主要观点是编号2.阅读[Parse.Object.saveAll vs Parse.Promise.when](https://www.parse.com/questions/parseobjectsaveall-vs-parsepromisewhen) –

+0

网络呼叫优化使总体感觉。我仍然不清楚为什么'Parse.Promise.when()'在promise链中的保存操作实际完成之前解决?至少,这似乎正在发生。 –

+0

@TariqZabian尝试使用'console.log'链接每个'save',看看它们是否都在'Promise.when'的'then'之前执行... – mido