0

在以下代码中,控制器在记录“对象已销毁”的服务中运行一个函数。该函数返回一个承诺。

在该承诺的 .then() 上,在控制器中,它记录“已删除”

应该首先记录“对象被销毁”,然后(在.then() 中)它应该记录“已删除”。不幸的是,似乎首先记录了“已删除”。

似乎 .then() 的 promise 是在函数完成之前运行的。

应用程序.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();                                                                                                                   
         });                                                                          
     }   
4

1 回答 1

0

在成功回调中对 result.destroy() 的调用是异步的,因此您的成功函数将继续执行并返回,然后保证您从 deleteData 函数返回将得到解决。所有这些都在 result.destroy() 回调之前。

最终,您希望 deleteData 从 result.destroy() 返回承诺。

这是一个粗略的例子

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();                                                                
    });                                                                                                                                             
};
于 2013-11-11T11:41:44.630 回答