асинхронное ожидание не работает должным образом - PullRequest
0 голосов
/ 19 мая 2018

Я новичок в async, await и promise функциях JavasSript.

Что я делаю,

async function sendTextMessage(text) {
    console.log("----1----");
    var messageData = {
        message: {
            text: text
        }
    };
   await callSendAPI(messageData);
}

async function sendImageMessage(imageUrl) {
    console.log("----2----");
    var messageData = {
        message: {
            url: imageUrl
        }
    };
  await callSendAPI(messageData);
}

async function sendQuickReply(replies) {
    console.log("----3----");
    var messageData = {
        message: {
            text: text,
            quick_replies: replies
        }
    };
   await callSendAPI(messageData);
}
async function callSendAPI(messageData) {
    await request({
        uri: 'https://graph.facebook.com/v2.6/me/messages',
        qs: {
            access_token: config.FB_PAGE_TOKEN
        },
        method: 'POST',
        json: messageData

    }, function(error, response, body) {
        if (!error && response.statusCode == 200) {
            var recipientId = body.recipient_id;
            var messageId = body.message_id;

            if (messageId) {
                console.log("Successfully sent message with id %s to recipient %s",
                    messageId, recipientId);
            } else {
                console.log("Successfully called Send API for recipient %s",
                    recipientId);
            }
        } else {
            console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
        }
    });
}

Я вызываю эти функции одним переключателемнапример,

async function send(){
     await sendTextMessage(text);
     await sendImageMessage(img);
     await sendQuickReply(replies)  
}
send()

Но пока ответ показывает sendImageMessage() последний, потому что эта функция может не готовиться, когда я посылаю imageUrl для генерации ответа.

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Вы должны ждать вызовов API:

 await callSendAPI(messageData);

И, следовательно, функции, которые нужны этим вызовам, должны быть также async и await ed при вызове и т. Д.

0 голосов
/ 19 мая 2018

Я надеюсь, что все, что вы хотите сделать, это обработать некоторые операции в строгом порядке.

Вот почему существует асинхронизация и ожидание в ES6.

Так, например, это может быть так: Aзатем выполните B, затем C или A> B> C

. Как видно, последний метод do3 имеет задержку всего в 500 мс, но он выполняется как последний, а не как первый.Без асинхронных и ожидающих операторов это будет выполнено как первая функция, и это поведение по умолчанию выполнения JavaScriptBroser выполнит код синхронизации первым и асинхронный после.Но не с async и больше ожидаем:)

Вы также должны знать, что если вы добавите префикс string, номер функции с помощью await, то автоматически преобразуется в обещание.

Консоль выведет:

'juraj1'
'juraj2'
'juraj3'

вот простой пример:

function do1() {
      return new Promise(resolve => {
          return setTimeout(() => resolve("juraj1"), 3000);
   });
 }
function do2() {
      return new Promise(resolve => {
            return setTimeout(() => resolve("juraj2"), 2000);
  });
 }

function do3() {
      return new Promise(resolve => {
             return setTimeout(() => resolve("juraj3"), 500);
  });
}

async function ForceAsynTOBeSync() {
    const a = await do1();

    console.log(a);

    const b = await do2();

    console.log(b);

    const c = await do3();

    console.log(c);
  }

  ForceAsynTOBeSync();
0 голосов
/ 19 мая 2018

Обратите внимание, что этот ответ был написан против исходного вопроса , а не последующих изменений, выполненных OP.


Функция async является асинхронной.Другие функции не будут ждать этого.

Таким образом, вы вызываете sendTextMessage, который вызывает callSendAPI, а затем выполняется остальная часть программы.

callSendAPI работает асинхронно.Он вызывает request и ожидает разрешения, возвращенного request.Когда он разрешен, callSendAPI получает возвращаемое значение request (хорошо, если бы вы захватили возвращаемое значение), а затем продолжает со следующей строки (только следующей строки нет).


async / await не делают асинхронный код синхронным.Они просто делают это похожим на внутри функции, объявленной как async, которая сама становится асинхронной.


Вы можете поместить три вызова функции в asyncсвоей собственной функцией, убедитесь, что каждый из них возвращает Обещание, а затем вызовите каждый из этих трех с помощью await.


См. также Как я могу вернуть ответ от асинхронного вызова?.

...