【问题标题】:resolve promise after setTimeout inside promise在promise 中的setTimeout 之后解决promise
【发布时间】:2022-02-02 20:14:58
【问题描述】:

我想在我的 setTimeout 完成后兑现我的承诺。我有几个像 step 这样的函数,主要思想是按顺序获取步骤结果。附言我们不能改变 setTimeout。

function step (done) {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(done, 5100, 'hello world')
      resolve()
    } catch (error) {
      reject()
    }
  })
}

【问题讨论】:

  • "P.S. we can't mutate setTimeout." 那么,我们可以修改什么?
  • @ikhvjs 是的:(你知道如何解决它吗?
  • @АлександрАлександр,您没有回答 Kaiido 的第一条评论。 what can we modify?
  • @ikhvjs 我们可以访问 done 回调,如果有帮助我们可以修改它
  • 为什么可以在 step 函数中添加 resolve 而不能在额外的 setTimeoutcallback 中添加?逻辑不会改变,只是写法不同

标签: javascript async-await promise settimeout


【解决方案1】:

如果您不能改变setTimeout,请将其删除。与其将 setTimeout 放在 step 函数中,不如创建一个新的 delay 函数来返回一个承诺。然后,您可以使用async/await 在某些延迟后完成这些步骤。

function delay(time = 1000) {
  return new Promise(res => {
    setTimeout(() => res(), time); 
  });
}

function step(fn, n) {
  fn(`hello world ${n}`);
}

const fn = (str) => console.log(str);

async function main() {
  step(fn, 1);
  await delay(5000);
  step(fn, 2);
  await delay(3000);
  step(fn, 3);
}

main();

【讨论】:

    【解决方案2】:

    如果你可以改变done函数,你可以像下面那样做。

    function step(done) {
        return new Promise((resolve, reject) => {
            immutableFunc(done(resolve, reject));
        });
    }
    
    function immutableFunc(done) {
        setTimeout(done, 1000, "hello world");
    }
    
    function done(resolve, reject) {
        return arg => {
            try {
                console.log(arg);
                resolve();
            } catch (error) {
                reject(error);
            }
        };
    }
    
    async function test() {
        try {
            await step(done);
            await step(done);
            await step(done);
        } catch (err) {
            console.log(err);
        }
    }
    
    test();

    【讨论】:

    • 不需要try/catch in(同步部分)promise executor
    • @Bergi,感谢您的提醒。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2018-02-06
    • 2023-03-31
    相关资源
    最近更新 更多