javascript - 我怎样才能不断重复第一个承诺,直到第二个承诺解决?
问题描述
所以我有一个创建视频的 React 应用程序,这是一个非常长的 api 请求,需要 1 到 10 分钟才能解决。我有一个单独的 api 调用,我需要每隔几秒钟连续运行一次以检查状态,直到第一个承诺得到解决(并且视频被编译)。
const promise1 = axios.post("/api/create", data);
//promise1 takes between 1 and 10 minutes to resolve (video creation).
const promise2 = axios.get(`/progress-${uniqueId}.txt`);
// I need promise2 (which checks status of promise1) to continually run
//at an interval (every 5 seconds?) until promise 1 resolves
Promise.race([promise1, promise2]).then(res=>{
//this obviously returns promise2 first, as expected, but
//once it comes back I need it to refire after 5 seconds
//continually until promise 1 resolves
console.log(res)});
};
知道如何递归调用 Promise2 直到 Promise1 解决?
解决方案
根据定义,Promise 是在稍后的某个时间点最多返回一次值的函数。你不能重新运行一个承诺,你能做的最好的就是使用一些工厂模式重新创建一个。
除此之外,您还需要一种机制来检查您的创建承诺是否已实现。
// Send create request
const creationPromise = axios.post("/api/create", data);
// Track creationPromise state
let isCreated = false;
creationPromise.then(() => isCreated = true);
// factory for creating a new progress request on-demand
const progressFactory = () => axios.get(`/progress-${uniqueId}.txt`);
// While the created request hasn't completed, loop
while (!isCreated) {
// Send new progress request
const progress = await progressFactory();
console.log("progress", progress);
}
// Done, create returned
console.log("Finished!");
推荐阅读
- angular - 来自密码重置电子邮件的 Angular 5 路由
- python - 如何在 Python 中使用自定义包/模块仅导入脚本中的函数?
- dialogflow-es - 带有日语/阿拉伯语输入字符串的对话流代理查询
- node.js - 强制 IOT 客户端与服务器通信
- javascript - 无法从 Nuxt.js 中间件导入模块
- c++ - C++ 哈希表 - 如何解决 unordered_map 与自定义数据类型作为键的冲突?
- c# - 实例化接受 Resolve 的对象
- redux - Redux 不可变更改数组顺序
- regex - 如何从 Hive 中的字符串正则表达式数字间隔
- c++ - C ++:使用另一个字符大写一个字符