0

次のコードでは、コントローラーは「オブジェクトが破棄されました」をログに記録するサービスで関数を実行します。その関数は promise を返します。

そのプロミスの .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();                                                                                                                   
         });                                                                          
     }   
4

1 に答える 1

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