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中my
AjaxPromiseService.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
}