2016-06-16 125 views
1

下面的代碼:的Javascript承諾/然後在不正確的順序執行

vm.saveData = function(data) { 

      demoService.saveData(data, function(response) { 
       if (response.status === 200) { 
        principal.identity(true).then(function() { 
         $state.reload(); 
         return toastr.success('Success'); 
        }); 

       } 
       return toastr.error('Failure'); 
      }); 
} 

在充分利用API成功響應,它應該只顯示「成功」的消息。但是,它首先顯示'失敗'消息,然後顯示'成功'消息。我究竟做錯了什麼?我是否需要暫停或者有什麼我在這裏失蹤的東西?

+1

在'else'中返回錯誤。 –

+0

是的,這是最簡單的解決方案,它也起作用。如果我使用其他,那麼我可以簡單地使用toastr來顯示消息並從那裏刪除返回。但我知道我做錯了,這就是爲什麼,那麼不行。我只是想知道我的錯在哪裏。 – Samridhi

+0

承諾的最佳解釋:https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html –

回答

1

如果狀態是200,那麼你設置了一個承諾,稍後再打success

無論狀態是什麼(因爲它在if以外,並且您還沒有使用過else),您總是會撥打error

想必你只是想移動return toastr.error('Failure');else

+0

僅當狀態不等於200時纔會調用該錯誤消息。 – Samridhi

+0

@Samridhi - 不正確。請參閱此答案的第二段,特別是括號中的部分,這解釋了原因。 – Quentin

0

許多系統如AJAX發送多條消息,表示在任務進度。你想忽略早期的消息。失敗消息來自早期事件,而行動不完整。

1

這不是你如何設置承諾。承諾使用.then()。您只需使用傳遞函數作爲回調。

vm.saveData = function(data) { 

    demoService 
    .saveData(data) 
    .then(success, error); 

    function success(response) { 
    principal.identity(true).then(function() { 
     $state.reload(); 
     return toastr.success('Success'); 
    }); 
    } 

    function error(response) { 
    return toastr.error('Failure'); 
    } 
}; 
0

我發現了我的錯誤。添加'返回'解決了這個問題。

'迴歸principal.identity(真)。然後(函數(){

//在這裏做什麼

});'

vm.saveData = function(data) { 

      demoService.saveData(data, function(response) { 
       if (response.status === 200) { 
        return principal.identity(true).then(function() { 
         $state.reload(); 
         return toastr.success('Success'); 
        }); 

       } 
       return toastr.error('Failure'); 
      }); 
}