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

标签 javascript angularjs timeout promise

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

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/

相关文章:

javascript - 在angularjs中动态添加和删除元素的问题

javascript - AngularJS orderby 整数字段无法正常工作

timeout - Travis-CI - 如何计算构建的时间限制? (所有工作的总和或最长的工作时间)?

javascript - 如何在 Cypress 更新夹具文件

javascript - 附加到 Firebase 引用 AngularFire

javascript - jQuery:获取 HTML 5 放置的位置

macos - VPN 阻止 Git 请求

python - 将超时设置为 Tornado 中的 http 请求

javascript - rxjs - 缓冲流直到函数返回 true

JavaScript、正则表达式、反向匹配