首页 > 解决方案 > 我怎样才能不断重复第一个承诺,直到第二个承诺解决?

问题描述

所以我有一个创建视频的 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 解决?

标签: javascriptpromiseaxioses6-promise

解决方案


根据定义,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!");

推荐阅读