我应该如何在循环中等待bot.sendMessage()
?
也许我需要await Promise.all
但我不知道如何添加到bot.sendMessage()
代码:
const promise = query.exec();
promise.then(async (doc) => {
let count = 0;
for (const val of Object.values(doc)) {
++count;
await bot.sendMessage(msg.chat.id, ` ${count} and ${val.text}`, opts);
}
}).catch((err) => {
if (err) {
console.log(err);
}
});
错误:
[eslint] Unexpected `await` inside a loop. (no-await-in-loop)
答案 0 :(得分:10)
如果你需要一次发送一条消息,那么你所拥有的就好了,according to the docs,你可以忽略这样的eslint错误:
const promise = query.exec();
promise.then(async(doc) => {
/* eslint-disable no-await-in-loop */
for (const [index, val] of Object.values(doc).entries()) {
const count = index + 1;
await bot.sendMessage(msg.chat.id, ` ${count} and ${val.text}`, opts);
}
/* eslint-enable no-await-in-loop */
}).catch((err) => {
if (err) {
console.log(err);
}
});
但是,如果您能够并行发送它们,则应该这样做,以最大限度地提高性能和吞吐量:
const promise = query.exec();
promise.then(async(doc) => {
const promises = Object.values(doc).map((val, index) => {
const count = index + 1;
return bot.sendMessage(msg.chat.id, ` ${count} and ${val.text}`, opts);
});
await Promise.all(promises);
}).catch((err) => {
if (err) {
console.log(err);
}
});
答案 1 :(得分:2)
在大多数情况下,一旦迭代没有依赖性,就可以避免执行await
内部循环,这就是为什么eslint
警告它here
您可以将代码重写为:
const promise = query.exec();
promise.then(async (doc) => {
await Promise.all(Object.values(doc).map((val, idx) => bot.sendMessage(msg.chat.id, ` ${idx + 1} and ${val.text}`, opts);)
}).catch((err) => {
if (err) {
console.log(err);
}
});
如果你仍然发送一对一的消息,你的代码还可以,但是你会继续抛出这个错误
答案 2 :(得分:0)
我最近遇到了类似的问题,当我尝试以异步方式运行链中的一系列函数时出现了 linting 错误。
这对我有用...
const myChainFunction = async (myArrayOfFunctions) => {
let result = Promise.resolve()
myArrayOfFunctions.forEach((myFunct) => {
result = result.then(() => myFunct()
})
return result
}