Javascript承诺/然后没有按正确的顺序执行

时间:2016-06-16 12:38:02

标签: javascript angularjs angular-promise

以下是代码:

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获得成功响应后,它应该只显示“成功”消息。但是,它首先显示“失败”消息,然后显示“成功”消息。我究竟做错了什么?我是否必须暂停或是否有我在这里缺少的东西?

4 个答案:

答案 0 :(得分:1)

如果状态为200,那么您设置了稍后致电success的承诺。

无论状态如何(因为它位于if之外且您没有使用else),您始终致电error

据推测,您只想将return toastr.error('Failure');移至else

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

答案 2 :(得分:0)

许多系统(如AJAX)会发送多条消息来指示任务进度。您想忽略之前的消息。失败消息来自早期事件,而操作不完整。

答案 3 :(得分:0)

我发现了我的错误。添加'return'解决了这个问题。

'return principal.identity(true).then(function(){

//在这里做点什么

});'

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');
            });
}