2017-06-26 48 views
0

ctx.reply不需要爲了運行,儘管我。那麼()使用../ 我怎麼能把它修好// 我附上圖片更好地瞭解使for循環執行的任務,才能在節點JS

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

+2

請先修復代碼格式。 – Aron

回答

0

假設ctx.reply()正在返回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'));