2015-04-28 79 views
0

我正在編寫一個雲代碼函數,用於在刪除對象後運行許多任務。 我怎樣才能做到這一點乾淨,沒有嵌套?對雲代碼的承諾

您可以並行運行任務,或者最好讓它們按順序執行?如果是這樣,怎麼樣?

這是我的代碼,你能幫我清理/更改嗎?

Parse.Cloud.afterDelete("Photo", function(request) { 
    Parse.Cloud.useMasterKey(); 
    //delete all related activities 
    var queryAct = new Parse.Query("Activity"); 
    queryAct.equalTo("photo",{ 
    __type: "Pointer", 
    className: "Photo", 
    objectId: request.object.id 
    }); 
    queryAct.limit(1000); 
    queryAct.find({ 
    success: function(activities) { 
     Parse.Object.destroyAll(activities, { 
     success: function() { 
      //delete all related hashtags 
      var queryTags = new Parse.Query("hashTags"); 
      queryTags.equalTo("photo",{ 
      __type: "Pointer", 
      className: "Photo", 
      objectId: request.object.id 
      }); 
      queryTags.limit(1000); 
      queryTags.find({ 
      success: function(hashtags) { 
       Parse.Object.destroyAll(hashtags, { 
       success: function() {}, 
       error: function(error) { 
        console.error("Error deleting related hashtags " + error.code + ": " + error.message); 
       } 
       }); 
      }, 
      error: function(error){ 
       console.error("Error finding related hashtags " + error.code + ": " + error.message); 
      } 
      }); 
     }, 
     error: function(error) { 
      console.error("Error deleting related activities " + error.code + ": " + error.message); 
     } 
     }); 
    }, 
    error: function(error) { 
     console.error("Error finding related activities " + error.code + ": " + error.message); 
    } 
    }); 
}); 

謝謝大家!

回答

1

這裏find.then.delete是連續的一系列任務。但是,您可以並行刪除hastagsactivities,因爲它們似乎並不相關。請查詢promises guide瞭解更多信息。 您的代碼可以被縮短如下:

var Photo = Parse.Object.extend("Photo"); 

Parse.Cloud.afterDelete("Photo", function(request) { 
    Parse.Cloud.useMasterKey(); 

    var photo = Photo.createWithoutData(request.object.id); 

    var queryAct = new Parse.Query("Activity"); 
    queryAct.equalTo("photo", photo); 
    queryAct.limit(1000); 
    var promiseForActivities = queryAct.find().then(function (activities) { 
    return Parse.Object.destroyAll(activities); 
    }); 

    var queryTags = new Parse.Query("hashTags"); 
    queryTags.equalTo("photo", photo); 
    queryTags.limit(1000); 
    var promiseForHashtags = queryTags.find().then(function (hashtags) { 
    return Parse.Object.destroyAll(hashtags); 
    }); 

    return Parse.Promise.when([promiseForActivities, promiseForHashtags]).then(function() { 
    console.log("Done"); 
    }, function (err) { 
    console.error(err); 
    }); 
}); 

注意,你不需要創建自己的指針對象,如:

{ 
    __type: "Pointer", 
    className: "Photo", 
    objectId: "someId" 
} 

而是可以使用createWithoutData這是一個快捷方式:

var Photo = Parse.Object.extend("Photo"); 
var p = new Photo(); 
p.id = "someId"; 

我也認爲,這可能是足以直接通過request.object,像queryAct.equalTo("photo", request.object);

+0

你好,謝謝你的回覆,非常有用! 我有一個問題:在最後一步,你可以解釋。然後,當?沒有定義完成,因爲我稱之爲? – milonet

+0

現在修復它,它只是一個日誌說,當兩個承諾完成時「完成」 – knshn