2015-08-24 75 views
-2
var userQuery = new Parse.Query(Parse.User); 
userQuery.limit(500); 
if(helpers.isDefined(userSkip)){ 
    userQuery.skip(userSkip); 
} 

var userCount = 0; 

userQuery.find().then(function (users) { 

    _.each(users, function(user){ 
     console.log("Got user " + user.get("displayName")); 

     var viewHistoryQuery = new Parse.Query("ViewHistory"); 
     viewHistoryQuery.equalTo("user", user); 

     viewHistoryQuery.find().then(function(){ 
      console.log("Got here"); 
     }).then(function(){ 
      console.log("View History success"); 
     }, function (error) { 
      console.log("View History error"); 
     }); 
     userCount++; 
    }); 

}) 
.then(function() { 
    status.success("Processed " + userCount + " users"); 
}, function (error) { 
    status.error(JSON.stringify(error)); 
}); 

Got here永遠不會被打印到控制檯。我得到的唯一的輸出是:解析承諾永遠不會運行_.each()

I2015-08-24T15:04:03.424Z]Got user ##### 
I2015-08-24T15:04:03.424Z]Got user ##### 
Input: {} 
Result: Processed 500 users 

得到的用戶打印多次,我只是哈希了用戶名。沒有太大意義。承諾應該在_.each循環中運行,然後應該打印其中一條消息。它就好像它不存在一樣。我們知道用戶正在被循環訪問,但下一個承諾被忽略。

+1

據我所知,'then'不採取三個參數? – Bergi

+0

你很對。我已經更新了代碼,現在是正確的,但它似乎沒有糾正主要問題。謝謝你指出,雖然。 – JackalopeZero

+0

您知道'_.each'不會自動等待其中創建的任何承諾嗎?查詢開始後,您立即增加'userCount'並轉到下一個。 'Got Here'會在你的「處理過的500個用戶」之後登錄。也許'status.success'確實取消所有正在進行的查詢? – Bergi

回答

1

您的代碼創建承諾,但不是等着他們去解決。用「等待」的基礎上返回值:如果返回從then承諾將等待它繼續到鏈的下一部分之前:

emptyPromise().then(function(){ 
    return wait(1000); // the fact we return a promise from here is what causes it to wait 
         // remove the return and it will log done instantly 
}).then(function(){ 
    console.log("done"); 
}); 

在你的代碼的each的功能不返回任何東西 - 所以沒有等待。

userQuery.find().then(function (users) { 

    // this is a _.map so we get return values 
    var ps = _.map(users, function(user){  
     var viewHistoryQuery = new Parse.Query("ViewHistory"); 
     viewHistoryQuery.equalTo("user", user); 
     // We return here 
     return viewHistoryQuery.find().then(function(){ 
      console.log("Got here"); 
     }); 
     userCount++; 
    }); 
    // https://parse.com/docs/js/api/symbols/Parse.Promise.html#.when 
    return Parse.Promise.when(ps); // return a when call for all promises 
}).then(function(results){ 
    console.log("All Done here"); 
}); 
+0

優秀的答案。我曾經考慮過在承諾時通過when(),但認爲承諾會簡單地執行,並且Id必須在下一次()後處理它們,因此失去了與用戶的鏈接。感謝您解釋這一點。 – JackalopeZero