如何使此代码段符合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
功能,现在可以吗?或如何正确制作?谢谢。
使用.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
辅助功能,则更好。