在节点js中按顺序执行for循环执行任务

时间:2017-06-26 13:07:02

标签: javascript node.js

尽管我使用.then()../,但

ctx.reply并未按顺序运行 我该怎么办呢// 我附上一张图片以便更好地理解

bot.hears('کلید ها', (ctx) => {
    request('http://127.0.0.1:8080/json.htm?type=command&param=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("ارتباط با دیتابیس برقرار نشد ، لطفا دوباره تلاش کنید")
        }
    })
})

在这里看这张照片

不按顺序:

not in order

1 个答案:

答案 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'));