ctx.reply并未按顺序运行 我该怎么办呢// 我附上一张图片以便更好地理解
bot.hears('کلید ها', (ctx) => {
request('http://127.0.0.1:8080/json.htm?type=command¶m=getlightswitches', function (error, response, body) {
if (error == null) {
inputdevices = JSON.parse(body)
for (var key in inputdevices.result) {
ctx.reply(`${inputdevices.result[key].Name}`, Extra.HTML().markup((m) =>
m.inlineKeyboard([
m.callbackButton(`روشن`, `روشن کلید <%>${inputdevices.result[key].idx}<%> <#>${inputdevices.result[key].Name}<#>`),
m.callbackButton(`خاموش`, `خاموش کلید <%>${inputdevices.result[key].idx}<%> <#>${inputdevices.result[key].Name}<#>`)
])
)) .then(() => ctx.reply("*****************"))
}
}
else {
console.log("ارتباط با دیتابیس برقرار نشد ، لطفا دوباره تلاش کنید");
ctx.reply("ارتباط با دیتابیس برقرار نشد ، لطفا دوباره تلاش کنید")
}
})
})
在这里看这张照片
不按顺序:
答案 0 :(得分:0)
假设ctx.reply()
正在返回Promise
,您需要将所有Promise链接在一起。
不要使用for
循环,而是执行类似于一次调用一个函数的递归函数。您似乎没有直接使用key
,因此我们也会首先将数据映射到一个数组:
const arr = Object.keys(inputdevices.result).map(key => inputdevices.result[key]);
const replyNext = () => {
if (!arr.length) return Promise.resolve();
const inputDevice = arr.shift();
return ctx.reply(${inputDevice.Name}, Extra.HTML().markup((m) =>
m.inlineKeyboard([
m.callbackButton(روشن,روشن کلید <%>${inputDevice.idx}<%> <#>${inputDevice.Name}<#>),
m.callbackButton(خاموش,خاموش کلید <%>${inputDevice.idx}<%> <#>${inputDevice.Name}<#>)
])
)).then(() => ctx.reply("*****************"))
.then(replyNext);
}
这应该导致一个回复,等待它完成,然后触发下一个回复,直到你完成所有回复。
这确实使它们并行,这将使它比必要的慢,但它会使它保持有序。如果订单无关紧要,请使用Promise.all()
并将它们全部映射到Promises:
Promise.all(
Object.keys(inputdevices.result)
.map(key => /* contents of your for loop, return promise */)
).then(() => console.log('all done'));