Javascript AngularJS:超时承诺调用
在我的Javascript AngularJS:超时承诺调用,javascript,ajax,angularjs,timeout,promise,Javascript,Ajax,Angularjs,Timeout,Promise,在我的AjaxPromiseService.js工厂中,我一直在尝试将超时机制合并到promise调用中(通常是$http.get/post远程服务调用)。我目前的做法是在$timeout事件和实际承诺调用之间创建竞争。示例代码如下(来自AngularJS中myAjaxPromiseService.jsfactory的代码): 这似乎是可行的,如果未在指定的持续时间内解析getDummyData(),则timeoutPromise()将返回有用的标志,以便让AJAX调用正常失败。timeoutP
AjaxPromiseService.js
工厂中,我一直在尝试将超时机制合并到promise调用中(通常是$http.get/post远程服务调用)。我目前的做法是在$timeout
事件和实际承诺调用之间创建竞争。示例代码如下(来自AngularJS中myAjaxPromiseService.js
factory的代码):
这似乎是可行的,如果未在指定的持续时间内解析
getDummyData()
,则timeoutPromise()
将返回有用的标志,以便让AJAX调用正常失败。timeoutPromise()
和getDummyData()
最终都将按顺序解析,但是,如果先重新解析getDummyData()
,我想取消timeoutPromise()
。我想知道怎么做 $http
有一个timeout
参数,当承诺得到解决时,该参数会使请求超时-因此,您可以给它一个$timeout
承诺:
getData: function(input, timeout){
var timeoutPromise = timeout ? $timeout(function(){}, timeout) : null;
return $http({url: "/some/url",
timeout: timeoutPromise,
method: "GET"
}).then(function(response){
var data = response.data;
// do something with data, if needed
return data;
});
}
如果您使用的是$http,那么有一个更简单的选项。使用$http配置对象的超时属性和$timeout服务:
var requestTimeout = $timeout(function() {}, 4000);
$http({ method:'GET', url:'...', timeout: requestTimeout});
requestTimeout.then(function() {
console.log ('request aborted - timed out!');
});
当请求在超时时间内成功时,$超时将自动中止 根据,$http配置的timeout
属性接受一个承诺,或者一个毫秒数:
超时
–{number | Promise}
–以毫秒为单位的超时,或在解决时应中止请求的承诺
因此,解决方案很简单:
function getData () {
return $http.get(someUrl, {timeout: 3000}); // adjust the value to what you need
}
返回$http()。然后()
返回承诺。。。我不知道你在问什么-承诺什么?所以你不需要在$http()中包装$q.defer()来返回承诺?@TonyGW,当函数本身返回承诺时很少这样做,比如$http
和$timeout
do。。。事实上,它将是一个,但在timeoutPromise中,如果我想要返回一个带有标志{isTimeout:true}的承诺对象,我需要$q来创建一个返回承诺吗?timeoutPromise
在您的问题或我的回答中?您的意思是将其返回给getData
的用户吗?它将在哪里使用-在承诺处理程序中还是由调用方使用?换句话说,我不完全理解你的新要求。我建议你要么用澄清来编辑你的问题,要么创建一个新问题
function getData () {
return $http.get(someUrl, {timeout: 3000}); // adjust the value to what you need
}