Javascript promise .catch 不工作

标签 javascript

编辑:查看下面的答案

我有一个函数:

dataFactory.getCurrentStepId(wf.identifier, ctx.identifier)
   .then(function (data) {
      console.log('then');
      $timeout(function () {
      $("#app-node-" + data.identifier)
           .parent().parent().css("border", "5px solid green");
      });
    })
    .catch(function () {
      console.log('error');
      alert('Error!')
      });

getCurrentStepId 有一个异常,我看到控制台上打印了它发送的 AJAX 请求的错误,但我的警报和 console.log 没有在 catch 中触发。

有什么想法吗?这是它调用的内容:

app.factory('dataFactory', function ($http, $q) {
    var _baseUrl = webServiceContext;
    var _doGet = function (endpoint) {
        var deferred = $q.defer();
        $http.get(_baseUrl + '/' + endpoint).then(function (response) {
            deferred.resolve(response.data);
        });
        return deferred.promise;
    };

    var getCurrentStepId = function (wid, cid) {
        return _doGet('wf/step/' + wid + '/' + cid);
    };
})

答案在这里

@Blunderfest 几乎做对了:

 $http.get(_baseUrl + '/' + endpoint).then(function (response) {
            deferred.resolve(response.data);
        }).catch(function(e){return deferred.reject(e);});

最佳答案

确保在 catch block 中返回被拒绝的 promise 。所以这个:

$http.get(_baseUrl + '/' + endpoint).then(function (response) {
        deferred.resolve(response.data);
    })

应该是这样的:

$http.get(_baseUrl + '/' + endpoint).then(function (response) {
        deferred.resolve(response.data);
    }).catch(function(e){
         return $q.reject(e);
    });

实际上,您可以使用 $q.reject 作为拒绝 promise 的简写,所以我认为这是一个正确的答案:)。您还可以使用 return $q.when(response) 作为 deferred、resolve 等的简写。

我推荐阅读:$q.defer: You're doing it wrong

真的,我会重新组织您的代码以遵循一些关于 promise 的最佳实践,尤其是在 Angular 方面。最好返回 $http 请求本身(这是一个 promise ):

app.factory('dataFactory', function ($http, $q) {
    var _baseUrl = webServiceContext;
    var _doGet = function (endpoint) {
        // Returns the promise wholesale.
        return $http.get(_baseUrl + '/' + endpoint).then(function (response) {
            return response.data;
        }).catch(function(e){
            // ensures the returned promise is rejected up the chain.
            return $q.reject(e);
        });
    };

    var getCurrentStepId = function (wid, cid) {
        return _doGet('wf/step/' + wid + '/' + cid);
    };
})

Angular Docs for $q methods :

reject(reason) – rejects the derived promise with the reason. This is equivalent to resolving it with a rejection constructed via $q.reject

您需要这样做的原因是,如果您不捕获错误并拒绝较低级别的 promise ,则 promise 链上游将不知道 promise 被拒绝并将其视为成功。

关于Javascript promise .catch 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091054/

相关文章:

javascript - 为什么 String() 在 JS 中会压平数组?

javascript - 如何在表格列中添加阅读更多或更少按钮

javascript - 在 JS 中返回干净的、不受时区限制的日期

javascript - 无法使用 WATER 单击链接

javascript - 如何读取来自 idp 的 SAML 响应以使用户登录到应用程序

javascript - 使用 javascript 需要在整个页面中随机且唯一的数字

javascript - 运行使用 jsonp 获取的脚本标签

javascript - 如何使用静态占位符和自定义图标构建引导下拉列表

javascript - 如何知道 DOM 元素是否挂载到树

javascript - React JS - IMG onclick 事件后无法更新文本