【问题标题】:How do I use reject properly in this setTimeout using promises?如何使用 promise 在此 setTimeout 中正确使用拒绝?
【发布时间】:2020-07-20 19:34:06
【问题描述】:

AsyncTimeout 只是将 setTimeout 包装在一个 Promise 中,这样它就可以在 Promise 链中使用。但是我没有看到实现reject()的好地方

function asyncTimeout(time, callback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const results = callback();
      resolve(results);
    }, time );
  });
}

asyncTimeout(1000, (test) => {
  console.log('resloved');
}).then(()=>{
  console.log('now what')
});

【问题讨论】:

  • 什么意思"实现reject()"?在什么情况下应该拒绝承诺并去catch而不是then?我们不能告诉你。
  • reject 已经为您实现了。由于您是程序作者,因此您可以根据自己的逻辑在任何地方调用它。你想在什么情况下拒绝承诺?
  • 将你的回调包裹在一个 try catch 中,并在那里拒绝......例如.. try { const results = callback() } catch(e) { reject (e) }
  • 为什么需要回调? asyncTimeout(1000).then(...).then(...) ...

标签: javascript promise settimeout


【解决方案1】:

您可以将callback() 调用包装在try/catch 块中,并在出现异常时调用reject(err)

function asyncTimeout(time, callback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        const results = callback();
        resolve(results);
      } catch(err) {
        reject(err);
      }
    }, time );
  });
}

然而,正确的解决方案是根本不向asyncTimeout 传递回调——只需使用返回的promise 及其then 方法!承诺永远兑现,不用reject

function asyncTimeout(time, callback) {
  return new Promise(resolve => {
    setTimeout(resolve, time);
  });
}

asyncTimeout(1000).then(() => {
  console.log('resolved');
  throw new Error('oops');
  console.log('now what');
}).catch(err => {
  console.error('handled', err);
});

【讨论】:

  • 当然,我们可以假设 setTimeout 不会抛出错误,或者我们可以将它放在 try catch 块中以保持一致。无论哪种方式我都可以接受吗?
  • 是的,setTimeout 不会抛出任何错误 afaik(也许当你耗尽计时器 id 时?),但即使它这样做了,new Promise 构造函数已经处理来自执行器回调的同步异常,并且拒绝承诺。
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 2022-01-18
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多