typescript 如果在给定时间内未完成执行,则节点解析承诺

rkttyhzu  于 2023-02-10  发布在  TypeScript
关注(0)|答案(4)|浏览(154)
return await new Promise(function (resolve, reject) {

 //some work goes here

resolve(true)

  });

带设置超时

return await new Promise(function (resolve, reject) {

 //some work goes here

setTimeout(function() { resolve(true); }, 5000);

  });

使用setTimeout,即使我的任务在1秒内完成,它也会等待5秒。我的要求是,如果任务在5秒内完成,则承诺应立即解决,否则将在5秒内解决

6ie5vjzr

6ie5vjzr1#

任务正常完成时清除超时:

return new Promise(function (resolve, reject) {

    let safetyTimeout = setTimeout(resolve, 5000);

    //some work goes here

    // When it's done :

    clearTimeout(safetyTimeout);
    resolve();
});
zf2sa74q

zf2sa74q2#

杰里米·蒂尔的回答是我认为最好的练习。
只是因为我花了一些时间写了一段代码供任何人使用,我张贴它,也许它会帮助一些人与他们的代码实验。

async function test() {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve("5 Seconds Passed");
    }, 5000);

    // Some work equivalent to
    someWork(3000, resolve);
  });
}

console.log(await test());

function someWork(time, resolve) {
  // Some work goes here.
  setTimeout(function () {
    console.log("WORK STILL RUNNING");
    resolve("INSIDE 2nd TIMEOUT");
  }, time);
}

只是不要忘记实现Jeremy Thille clearTimeout。

41zrol4v

41zrol4v3#

你可以这样做:

return await new Promise(function (resolve, reject) {
 setTimeout(function() { resolve(true); }, 5000);
 let result = await someworkDone();
 if (result) resolve(result);
});

这里要注意几点:

      • 指定任何人工作前5秒的时间**(声明定位非常重要)
  • 然后把其他工作做完
  • 如果您的工作在5秒内完成,请立即解决,如上面的示例所示。
mrfwxfqh

mrfwxfqh4#

这里有一个使用Promise.race的例子。这个想法是在Promise.race well做我们的工作,并将工作承诺与另一个在给定时间内解决的承诺进行比赛(下面的例子中假设为10秒),

// let's say I've to make a db connection within 10 seconds, else throw an error
const pool = await Promise.race(
    [
        poolPromise, // a db connection promise
        new Promise((_, reject) => setTimeout(
            () => {
                reject("can't establish connection within 10s")
            }, 10e3)
        )
    ]);

相关问题