2013-10-23 61 views
0

我用下面的代碼(以下簡化例子的sake_讓所有用戶在我的數據庫裏面,然後訪問它返回我希望用戶的行保存在數據庫中數據的外部API。HttpRequest的一個承諾

這似乎並沒有工作......用戶數據不會被保存。我是新來解析...所以我究竟做錯了什麼?

Parse.Cloud.job("updateToken", function(request, status) { 

    Parse.Cloud.useMasterKey(); 
    var query = new Parse.Query(Parse.User); 

    query.find().then(function(results) { 

     var promises = []; 

     _.each(results, function(user) { 

       promises.push(function() { 

        Parse.Cloud.httpRequest({ 
         url: "http://www.example.com/", 
         success: function(httpResponse) { 

         user.set("authSave", httpResponse.text); 
         return user.save(); 

         }, 
         error: function(httpResponse) { 
         user.set("authSave", "testFail"); 
         return user.save(); 
         } 
        }); 
       }); 
     }); 

     Parse.Promise.when(promises); 
    }).then(function(){ 
     status.success("YAY!"); 
    }); 

}); 

回答

0

沒有花時間去檢查,但他函數處理query.find.then應該返回一個承諾。

試一下:

query.find.then(function(results) { 

    ... 

    return Parse.Promise.when(promises); 

}).then (function(){ 
    status.success("YAY!"); 
}); 
1

因爲httpRequest是異步的,所以傳遞給你的promise數組的所有函數都會在httpRequest調用它們的回調函數之前完成。

您希望使用從httpRequest方法返回的promise並將其轉換爲數組。

像這樣

Parse.Cloud.job("updateToken", function(request, status) { 

    Parse.Cloud.useMasterKey(); 
    var query = new Parse.Query(Parse.User); 

    query.find().then(function(results) { 

     var promises = []; 

     _.each(results, function(user) { 

      promises.push(Parse.Cloud.httpRequest({ 
        url: "http://www.example.com/" 
       }).then(function(httpResponse) { 
        user.set("authSave", httpResponse.text); 
        return user.save(); 
       }, function(error) { 
        user.set("authSave", "testFail"); 
        return user.save(); 
       }) 
      ); 
     }); 

     Parse.Promise.when(promises); 
    }).then(function(){ 
     status.success("YAY!"); 
    }); 
}); 

我很抱歉,如果這不是完美的,因爲我沒有測試。但它應該引導你朝着正確的方向前進。

+0

有沒有人最後測試這個?這會改善這個答案的質量。 –