gpt4 book ai didi

Javascript promise .catch 不工作

转载 作者:行者123 更新时间:2023-12-05 07:51:25 24 4
gpt4 key购买 nike

编辑:查看下面的答案

我有一个函数:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com