2014-03-06 124 views
0

我已經編寫了基於Parse.com中提供的Parse示例的代碼來執行Series中的承諾。序列中的承諾沒有按順序執行

但是,好像順序處理工作不正常。

以下代碼通過系列承諾多次調用雲功能,即'sampleCloudFuction',但按順序排列。

執行循環後,應用程序將調用另一個js函數,該函數將加載剩餘的項目(不包括處理的項目)。

這是環路,多次調用雲功能:

var seriesPromise = new Parse.Promise.as(); 

$.each(items, function (i) { 
       .. 
       .. 

       count++; 
       if (count >= 25 || (i + 1) >= selectedItemsLength) { 

        .. .. 

//Series Promise: The code to be executed in sequence being placed within the 
//then() the existing promise 

        seriesPromise = seriesPromise.then(function() { 
         Parse.Cloud.run('sampleCloudFuction', itemsArray, function() { 
          console.log("success callback in JS"); 
          var tempPromise = Parse.Promise.as(); 
          return tempPromise; 


         }, function (error) { 
          alert("Error " + error.code + "::"); 
          console.log("error callback in JS") 
         }); 
        }); 

        count = 0; 


       } 
      }); 

.. 
.. 


seriesPromise.then(function() { 
       //Fetch the approval state of the disabled button 
       alert("load remaining items"); 

      }); 

下面的功能是執行循環後調用。但是,在接收所有先前請求的回調之前,這個名稱已被調用。

seriesPromise.then(function() { 
      //Fetch the approval state of the disabled button 
      alert("load remaining items"); 

     }); 
+0

您需要顯示的代碼從那裏seriesPromise是定義 – wayne

+0

@wayne,我已經包含上述代碼中的註釋。 ----- var seriesPromise = new Parse.Promise.as(); - –

回答

2
Parse.Cloud.run('sampleCloudFuction', itemsArray, function() { 
    console.log("success callback in JS"); 
    var tempPromise = Parse.Promise.as(); 
    return tempPromise; 
}) 

這是行不通的。從回調中您不能return - 價值將會消失。

然而,the docs狀態

在解析的JavaScript SDK每個異步方法返回一個Promise

- 你甚至都不需要去嘗試構建它自己!

那麼,爲什麼順序處理不能正常工作?因爲它要求then回調確實返回下一步的值 - 這可能是一個異步的,尚未解決的承諾。然後,新的seriesPromise將在執行下一步之前等待該步驟。

然而,你不從回調返回任何東西 - 所以then只是undefined解決seriesPromise立即。返回.run()產量的承諾:

var seriesPromise = new Parse.Promise.as(); 
$.each(items, function (i) { 
    … 
    // Series Promise: The code to be executed in sequence being placed within the 
    // then() the existing promise 
    seriesPromise = seriesPromise.then(function() { 
     return Parse.Cloud.run('sampleCloudFuction', itemsArray); 
//  ^^^^^^ 
    }); 
    … 
}); 
seriesPromise.then(function() { 
    //Fetch the approval state of the disabled button 
    alert("load remaining items"); 
}, function (error) { 
    alert("Error " + error.code + "::"); 
    console.log("error callback in JS"); 
}); 
+0

它的工作原理,謝謝。 –

0
var seriesPromise = new Parse.Promise.as(); 

$.each(items, function (i) { 
       .. 
       .. 

       count++; 
       if (count >= 25 || (i + 1) >= selectedItemsLength) { 

        .. .. 

       // I don't know where you got the understand wrapping code in 
       // Parse.Promise.as() it will executed in series. 

       // from the docs: 
       // Parse.Promise.as() 
       // Returns a new promise that is resolved with a given value. 

       // in fact the following line executed right away and this foreach 
       // function for this item return immediately. 
        seriesPromise = seriesPromise.then(function() { 
         Parse.Cloud.run('sampleCloudFuction', itemsArray, function() { 
          console.log("success callback in JS"); 
          var tempPromise = Parse.Promise.as(); 
          return tempPromise; 


         }, function (error) { 
          alert("Error " + error.code + "::"); 
          console.log("error callback in JS") 
         }); 
        }); 

        count = 0; 


       } 
      }); 

不幸的是我真的不明白你想做什麼。如果你的代碼太長,你可以放一個jsfiddle。