2017-06-26 2 views
0

ctx.reply nicht um ausgeführt trotz i .then() verwenden ../ wie könnte ich es beheben // ich ein Bild zum besseren Verständnis befestigendie for-Schleife machen tun Aufgaben, um im Knoten 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("ارتباط با دیتابیس برقرار نشد ، لطفا دوباره تلاش کنید") 
     } 
    }) 
}) 

Blick auf dieses Bild hier

Nicht in Ordnung:

not in order

+2

Bitte korrigieren Sie zuerst die Formatierung des Codes. – Aron

Antwort

0

Unter der Annahme, ctx.reply() gibt eine Promise zurück, Sie müssen alle Promises verketten.

Anstatt eine for-Schleife zu verwenden, tun Sie etwas wie eine rekursive Funktion, die Dinge nacheinander aufruft. Es sieht aus wie Sie key nicht direkt verwenden, so dass wir auch zunächst einfach die Dinge auf einen Array Karte:

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); 
} 

Diese eine Antwort gehen verursachen soll, warten, bis es fertig ist, dann löst die nächste bis du alle fertig hast.

Dies bringt sie parallel, was es langsamer als nötig macht, aber es wird es in Ordnung halten. Wenn die Reihenfolge keine Rolle spielt, dann verwenden Sie Promise.all() und ordnen Sie sie allen zu:

Promise.all(
    Object.keys(inputdevices.result) 
    .map(key => /* contents of your for loop, return promise */) 
).then(() => console.log('all done')); 
Verwandte Themen