2013-09-22 70 views
0

在以下代碼中,控制器在記錄「對象已被銷燬」的服務中運行一個函數。該函數返回一個承諾。然後.then()函數似乎在承諾完成之前運行

這一承諾的。然後(),在控制器,它記錄「已刪除」

「對象被破壞」應被第一次登錄,然後(在the.then())應該記錄「刪除」。不幸的是,好像「刪除」是先登錄的。

看起來好像承諾的.then()在函數完成之前運行。

app.js

this.deleteData = function (db, objectId) {          
     var database = Parse.Object.extend(db);          
     var query = new Parse.Query(database);          
     return query.get(objectId, {             
      success: function (result) {            
       result.destroy({              
        success: function (result) {          
         console.log("object was destroyed");       
        },                
        error: function (result, err) {         
         console.log("object was not destroyed");      
         console.log(err);            
        }                 
       });                 
      },                  
      error: function (result, err) {           
       console.log(err);              
      }                   
     });                   
    } 

控制器

function ResourcesCtrl ($scope, globalFunctions, CRUD) { 
    $scope.deleteResource = function (objectId) {          
     CRUD.deleteData('resources', objectId).then(function (result2) {    
      console.log("deleted");             
      refreshResources();                             
     });                   
    } 
+0

什麼是'Parse.Query'是吧'$資源'或'http'調用? '$ resource'不返回承諾。 – Chandermani

+0

我認爲Parse.Query本身是一個對象,但它具有承諾的函數(如get())。這裏是文檔:http:// sdsd(https://parse.com/docs/js/symbols/Parse.Query.html – bzupnick

回答

0

的調用result.destroy()的成功調用之內回是異步的,因此你的成功的功能將繼續,並返回,然後保證你從你的deleteData函數返回將得到解決。所有這些在調用result.destroy()之前。

最終,您希望deleteData從result.destroy()返回promise。

這裏是一個粗略的例子

this.deleteData = function (db, objectId) {          
    var database = Parse.Object.extend(db);          
    var query = new Parse.Query(database);          
    return query.get(objectId).then(function (result) {            
      return result.destroy().then(function (result) {          
        console.log("object was destroyed");       
       }, function (err) {         
        console.log("object was not destroyed");      
        console.log(err);            
       });                 
      }, function (err) {           
       console.log(err);              
      });                                     
}; 

,然後如果你不需要記錄中可以更加簡潔

this.deleteData = function (db, objectId) {          
    var database = Parse.Object.extend(db);          
    var query = new Parse.Query(database);          
    return query.get(objectId).then(function (result) {            
     return result.destroy();                 
    });                                    
}; 
相關問題