在这种情况下如何避免嵌套承诺

问题描述 投票:0回答:1

如何使此代码段符合eslint规则,或者可以使它更具可读性/雅致性而又没有嵌套承诺?

class Sync {
  io = IO.getInstance();

  constructor(token) {
    this.token = token;
  }
  
  sendMessage = (
    data,
    retryTimeout = 0,
  ) => {
    const response = this.io.request(requestConfig); // should return a Promise
    const timeout = retryTimeout + 3000;
    // want to retry when AJAX error
    return response
      .catch(() => new Promise((resolve, reject) => {
        if (this.token === data.token) {
          // eslint warning: Avoid nesting promises.eslint(promise/no-nesting)
          setTimeout(() => this.sendMessage(data, timeout).then(resolve, reject), timeout);
        } else {
          reject(new Error('Failed to send message due to network offline'));
        }
      }));
  }
}

class Sync {
  async sendMessage(data, retryTimeout = 0) {
    const timeout = retryTimeout + 3000;
    try {
      await this.io.request(requestConfig); // should return a Promise
    } catch(e) {
      if (this.token === data.token) {
        await new Promise(resolve => {
          setTimeout(resolve, timeout);
        });
        return this.sendMessage(data, timeout);
      } else{
        throw new Error('Failed to send message due to network offline');
      }
    }
  }
我试图将其更改为async功能,现在可以吗?或如何正确制作?

谢谢。

javascript promise async-await
1个回答
0
投票

使用.then(resolve, reject)Promise constructor antipattern。链接它:

Promise

如果将class Sync { sendMessage(data, retryTimeout = 0) { const response = this.io.request(requestConfig); // should return a Promise const timeout = retryTimeout + 3000; // want to retry when AJAX error return response.catch(() => { if (this.token === data.token) { return new Promise(resolve => { setTimeout(resolve, timeout); }).then(() => this.sendMessage(data, timeout)); } else { throw new Error('Failed to send message due to network offline'); } }); } new Promise(…)重构为setTimeout辅助功能,则更好。

© www.soinside.com 2019 - 2024. All rights reserved.