gpt4 book ai didi

angularjs - 如何设置超时以中止工厂或服务中的 $http.get()?

转载 作者:行者123 更新时间:2023-12-04 11:03:52 25 4
gpt4 key购买 nike

我有以下方法getData(url)在我的工厂 使用 $http.get(url)从 URL 获取数据

angular
.module('az-app')
.factory('WebServiceFactory', function ($http, $q) {

var WebServiceFactory = this;


WebServiceFactory.getData = function (url) {

var deferred = $q.defer();

$http.get(url)
.then(
function (response) {

deferred.resolve({
data: response
});

}, function (rejected) {

deferred.reject({
data: rejected
});
}
);
//Promise to be returned
return deferred.promise;
}

它工作正常,但我需要中止 http.get 和/或拒绝 promise ,以便我可以显示来自我的 的错误消息 Controller 有这个方法:
var getSpecialties = function (type) {
doctorsCtrl.showLoading();

var url = "example.com";

WebServiceFactory.getData(url)
.then(
function (result) {
doctorsCtrl.hideLoading();


var specialtiesArray = result.data.data;

StorageFactory.specialties = specialtiesArray;
doctorsCtrl.specialties = StorageFactory.specialties

//I WANT TO TRIGGER THIS REJECTED FUNCTION when timeout time is finished
}, function (rejected) {
doctorsCtrl.hideLoading();
doctorsCtrl.showAlert();
}
);
}

最佳答案

服务$http在配置对象中接受 timeout可以满足您的需求的属性。看看documentation ,尤其是关于 config 的部分目的:

timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.



另外,请注意您正在以低效的方式使用 Promise。以下是 promise 反模式 :

WebServiceFactory.getData = function (url) {

var deferred = $q.defer();

$http.get(url)
.then(
function (response) {

deferred.resolve(...);

}, function (rejected) {

deferred.reject(...);
}
);
//Promise to be returned
return deferred.promise;
}


你可以简单地:
WebServiceFactory.getData = function (url) {
return $http.get(url);
}

超时时间为 3 秒,它将是:

服务:
WebServiceFactory.getData = function (url) {
return $http.get(url, {timeout: 3000}); // <-- timeout applies ONLY for this call
}

Controller :
WebServiceFactory.getData(url).then(
function (result) {
doctorsCtrl.hideLoading();
doctorsCtrl.specialties = StorageFactory.specialties = result.data;
}, function (rejected) {
doctorsCtrl.hideLoading();
doctorsCtrl.showAlert();
}
);

另请注意,您调用的是 hideLoading在成功和错误的情况下。您可以在链式 finally 处理程序中调用它一次:
// ...
.finally(function () {
doctorsCtrl.hideLoading();
}

关于angularjs - 如何设置超时以中止工厂或服务中的 $http.get()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244752/

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