gpt4 book ai didi

javascript - 如何在 Angular 中将 Promise 链包装在 $timeout 中?

转载 作者:行者123 更新时间:2023-11-28 06:07:18 25 4
gpt4 key购买 nike

我有一项获取报告的服务:

ReportsResource.getActiveUsers() 。这使用 $http然后返回一个 promise 。

然后我像这样使用它:

var request = ReportsResource.getActiveUsers();

request.then(populateActiveUsersTable, handleError);

但是,问题是在后端获取活跃用户报告的请求可能需要几秒钟到 30 多分钟的时间。

  • 如果您发出请求,但没有可用的缓存报告,它会生成报告,然后请求会等待该请求的数据(同样,可能需要 2 秒或 30 分钟)。

  • 如果您提出请求并且当前正在生成报告,它会立即返回响应,告诉您报告尚未准备好。此时您可以继续轮询以查看报告是否准备就绪。

  • 如果报告已准备就绪(已缓存),则会立即返回带有报告数据的响应。

我需要的是将请求包装在等待最多 10 秒的超时中,然后如果响应时间超过 10 秒才能完成,则中止,并开始轮询服务器以询问报告是否已准备好。但如果请求在 10 秒内解决,它应该取消超时并正常执行 promise 链。

不太确定如何处理这个问题。

最佳答案

使用 Angular $q$timeout一起。使用 $q.defer() 创建延迟,创建超时请求,然后在 then 处理程序中转发结果以解决延迟。如果请求超时,则开始轮询。立即返还延期的 promise 。

var d = $q.defer() // defered for the final result

function poll() {
$http({...}).then( //poll request
function(res) {
if (ready(res))
d.resolve(res)
else {
$timeout(poll, 10000)
}
},
function(err) {
d.reject(err)
})
}

$http({ timeout: 10000, ... }).then(
function(res) {
d.resolve(res)
}, // return result directly
function(err) { // error or timeout
if (realError(err)) // check if real error
d.reject(err)
else { //timeout
$timeout(poll, 10000)
}
})
return d.promise

您可以任意重用返回的 Promise,经常调用 then 来等待或获取缓存的结果。

关于javascript - 如何在 Angular 中将 Promise 链包装在 $timeout 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720250/

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