簡體   English   中英

Javascript Promise.catch無法正常工作

[英]Javascript promise .catch not working

編輯:請參閱下面的答案

我有一個功能:

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並未觸發。

有什么想法嗎? 這是它正在調用的東西:

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

確保您在捕獲區域中返回了被拒絕的承諾。 所以這:

$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作為拒絕諾言的簡寫,所以我認為這是正確的答案:)。 您還可以將return $q.when(response)用作推遲,解決之類的縮寫。

我建議閱讀: $ q.defer:您做錯了

確實,我會重新組織您的代碼,以遵循關於Promise的一些最佳實踐,尤其是在角度方面。 最好返回$ http請求本身(這是一個承諾):

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

$ q方法的Angular Docs

reject(reason)–拒絕具有原因的派生承諾。 這等效於通過$ q.reject構建的拒絕來解決它

您需要執行此操作的原因是,如果您沒有發現錯誤並拒絕較低級別的承諾,則在線上的承諾鏈不會知道承諾被拒絕並將其視為成功。

試試這個代替

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");
  }, function (err) {
     console.log(err);
     alert(err);
  });

請記住, then接受2個參數-一個函數(如果成功),一個函數(如果發生錯誤)。 您只提供了成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM