然后.then()函数似乎在promise完成之前运行

时间:2013-09-22 02:41:32

标签: javascript angularjs parse-platform

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

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

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

似乎在函数完成之前运行了promise的.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();                                                                                                                   
         });                                                                          
     }   

1 个答案:

答案 0 :(得分: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();                                                                
    });                                                                                                                                             
};