簡體   English   中英

解析雲函數-依次執行代碼ot

[英]Parse cloud function - code ot executed in sequence

我有下面的函數來更新行,如果滿足某些條件,並且在for循環結束時,響應包括更新了多少行。盡管更新的行多於零,但響應顯示為零。 查看日志,似乎在完成for循環之前會觸發reponse.success()。

為什么這樣?

Parse.Cloud.define("reset", function(request, response) {


    var isSaveNeeded = false
  var Query = new Parse.Query("price");
  Query.equalTo('isActive', true);
  Query.find({useMasterKey:true})
      .then((results) => {
        console.log("Found " + results.length + " price rows")
        var currentDate = moment()
        var noOfRowsUpdated = 0
        for (let i = 0; i < results.length; ++i) {
            var valid_till_date = results[i].get('valid_till_date');

            if (valid_till_date == null) {
                // if user had not selected valid_till_date then set to expire after system max no of days
                var updatedAt = results[i].get('updatedAt');
                if (currentDate.diff(updatedAt,'days') > 10) {
                  console.log("Permanent change row to be set inactive. Updated at - " + currentDate.diff(updatedAt)+ updatedAt)
                    results[i].set('isActive',false)
                    isSaveNeeded = true
                }
            } else if (currentDate.diff(valid_till_date) > 0) {
                // check whether valid_till_date has passed
                console.log("Found row with elapsed valid date "  + results[i].id)
                results[i].set("isActive",false)
                isSaveNeeded = true
            }
            if (isSaveNeeded == true) {
              console.log("Record needs to be saved for " + results[i].id)
              results[i].save(null, {useMasterKey:true})
                .then(function (user) {
                    ++noOfRowsUpdated
                    console.log("reset : Object ID: " + results[i].id + " saved - " + noOfRowsUpdated)
                  })
                .catch(function (error) {
                    console.log("reset : Error saving Object ID: " + results[i].id + error);
                    response.error(error);
                })
            } else {

              console.log("Record not to be saved for " + results[i].id)
            }
            isSaveNeeded = false
        } // end of for loop
        //BELOW IS EXECUTED BEFORE FOR LOOP COMPLETES
        console.log("Updated " + noOfRowsUpdated +" price rows");
        response.success("Updated " + noOfRowsUpdated +" price rows")
      }) // end of .then((results) 
      .catch(function(error) {
        response.error("Failed to fetch from price" + error );
      });
});

Parse.com的save異步運行,因此循環在保存發生之前完成。 解決方案是稍微重組代碼,並在執行響應功能之前等待保存完成。

訣竅是將每個保存的返回的諾言收集到一個數組中,並等待Promise.when()Promise.when()同義詞Promise.when()實現這些諾言

為了更加清楚,請排除“需要保存”邏輯,因此該雲功能只能用於處理數據庫。

Parse.Cloud.define("reset", function(request, response) {
    var Query = new Parse.Query("price");
    Query.equalTo('isActive', true);
    Query.find({useMasterKey:true}).then((results) => {
        console.log("Found " + results.length + " price rows");
        // assuming ES6 or something like underscore
        let pricesToSave = results.filter(price => priceNeedsSave(price));

        // here's the important part, collect the promise from each save
        // proceed only after the promises have completed
        let promises =  pricesToSave.map(price => price.save(null, {useMasterKey:true}));
        return Parse.Promise.when(promises).then(() => pricesToSave.length);
    }).then(count => {
        response.success("Updated " + count +" price rows");
    }).catch(error => {
        response.error("Failed to fetch from price" + error );
    });
}

為了完整起見,下面是分解式的requireSave邏輯。 (OP應該檢查一下,我只是復制了循環的主體)...

function priceNeedsSave(price) {
    var isSaveNeeded = false;
    var currentDate = moment()

    var valid_till_date = price.get('valid_till_date');
    if (valid_till_date == null) {
        // if user had not selected valid_till_date then set to expire after system max no of days
        var updatedAt = price.get('updatedAt');
        if (currentDate.diff(updatedAt,'days') > 10) {
          console.log("Permanent change row to be set inactive. Updated at - " + currentDate.diff(updatedAt)+ updatedAt)
            price.set('isActive',false)
            isSaveNeeded = true
        }
    } else if (currentDate.diff(valid_till_date) > 0) {
        // check whether valid_till_date has passed
        console.log("Found row with elapsed valid date "  + price.id)
        price.set("isActive",false)
        isSaveNeeded = true
    }
    return isSaveNeeded;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM