按特定顺序将异步函数应用于 facebook 聊天机器人消息

Applying asynchronous functions to facebook chatbot messages in specific order

我正在为 facebook 做一个聊天机器人,但发送消息的顺序有问题

我在聊天中发送:

-Hi

机器人在控制台中响应:

-Hello!

-How can I help you?

但是在聊天中这样回复:

-How can I help you?

-Hello!

我尝试应用 async 和 await,但没有成功。

let postWebhook = (req, res) => {
// Parse the request body from the POST
let body = req.body;

// Check the webhook event is from a Page subscription
if (body.object === 'page') {

    // Iterate over each entry - there may be multiple if batched
    body.entry.forEach(function (entry) {

        // Gets the body of the webhook event
        let webhook_event = entry.messaging[0];

        // Get the sender PSID
        let sender_psid = webhook_event.sender.id;

        // Check if the event is a message or postback and
        // pass the event to the appropriate handler function
        if (webhook_event.message) {
            handleMessage(sender_psid, webhook_event.message); 
        }

    });

    // Return a '200 OK' response to all events
    res.status(200).send('EVENT_RECEIVED');

}};

let handleMessage = async (sender_psid, received_message) => {

let response;
if (received_message.text) {

    addUrl(`url/facebook?mensage=${received_message.text}&usuario=${user}&session=${sender_psid}&origem=${chanel}`)
        .then(res => res.json())
        .then(async json => {
            for (var i = 0; i < json.length; i++) {

                console.log(json[i].text || json[i].title)
                response = {json[i].text || json [i] tittle}
                await callSendAPI(sender_psid, response) //function to verify user and send message
              }   
    })
  await callSendAPI(sender_psid, response);      
}
};

如何确保顺序正确?

好吧,你可以这样简化:

const callSendAPII = (sender_psid, response) => {
return new Promise((resolve, reject) => {
    let request_body = {
        "recipient": {
            "id": sender_psid
        },
        "message": response
    }
    request({
        uri: 'https://graph.facebook.com/v12.0/me/messages',
        qs: {"access_token": MY_IG_PAGE_TOKEN},
        method: 'POST',
        json: request_body,
    }, (error, response, body) => {
        if (error) {
            reject(error);
        } else {
            resolve(response);
        }
    });
})

现在只需在调用函数中应用 await 即可:

await callSendAPII(sender_psid, response)