es6-promise - 在 JavaScript 承诺链中实现轮询机制
问题描述
我正在编写一个node.js (v12.13.0)
涉及 REST API 的脚本。想象以下任务序列,以相同的顺序执行:
Task 1
|
User Action
|
Task 2
|
Task 3
Task 1
=>通过调用 REST API获取 5 位字母数字代码(有效期10 分钟)User Action
=> 用户在网络浏览器中输入上述字母数字代码Task 2
=> 通过调用 REST API 获取 OAuth2 授权码;如果该User Action
步骤未完成,REST API 将返回错误响应Task 3
=> 完成后收到授权码后调用 REST API 获取 OAuth2 令牌Task 2
User Action
并且Task 2
必须在生成 5 位字母数字代码后的10 分钟Task 1
内完成。由于任务 1、2 和 3 在脚本中执行,因此无法准确知道用户何时完成User Action
. Task 2
因此,唯一的选择是重复调用 REST API,直到生成 OAuth2 授权码。如果 10 分钟过去了,并且 REST API 继续产生错误,那么脚本必须停止,因为它无法执行Task 3
。
我尝试使用 JavaScript Promise
(ES 6)并setInterval
按照以下方式实现这一点:
const fnPerformTask1 = () => {
return new Promise((resolve, reject) => {
/*
code goes here, to call REST API and obtain a 5-digit alphanumeric code
*/
resolve({
"code": "<5_digit_apha_code>"
"genTime": new Date()
})
});
}
const fnPerformTask2 = (task1Result) => {
return new Promise((resolve, reject) => {
/*
(a) code goes here, to call REST API and obtain an OAuth2 authorization code
(b) if REST API returns error _and_ 10 minutes have not yet elapsed, repeat step (a)
*/
resolve(<authorization_code>);
});
}
const fnPerformTask3 = (task2Result) => {
return new Promise(resolve, reject) => {
/*
code goes here, to call REST API and obtain OAuth2 tokens
*/
resolve(<tokens>);
});
}
fnPerformTask1()
.then(fnPerformTask2)
.catch(console.error) // if Task 2 fails, break out of this promise chain and don't perform Task 3
.then(fnPerformTask3)
.then(console.info)
.catch(console.error);
我可以在 REST API 返回授权码或 10 分钟后没有收到授权码的情况下实现某种类似轮询的机制吗?可能是因为用户没有Task 2
完成10分钟内?Promise
setInterval
User Action
第二个相关问题是,如果任务 2 无法完成,我该如何打破承诺链?
解决方案
如果任务 2 无法完成,我如何打破承诺链?
fnPerformTask1()
.then(fnPerformTask2)
.catch(err => throw err) // this will break the promise chain and the control will move to subsequent .catch()
.then(fnPerformTask3)
.then(console.info)
.catch((err) => console.log("potential error thrown from fnPerformTask2"));
推荐阅读
- javascript - Ref 获取子元素
- html - 使用 CSS 使用视差效果滚动
- powershell - 获取内容:找不到路径“H:\System.Management.Automation>InvocationInfo\before.txt”,因为它不存在
- swift - 仅检测文件夹而不是文档目录 iOS Swift 中的文件
- sql - 将查询插入三个表
- c# - 在 C# 中“动态”更改静态变量
- selenium - 云服务器实时预览不适用于 Zalenium
- postgresql - 无法使用 ansible 创建 postgres 数据库
- c++ - `const std::string&` 参数的“任何值”
- algorithm - 非均匀圆盘的最佳覆盖