javascript - 异步等待无法正常工作

标签 javascript node.js asynchronous promise es6-promise

我对 JavasSript 的 asyncawaitpromise 功能不熟悉。

我正在做的是,

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()

但是,虽然响应最后显示 sendImageMes​​sage() ,因为当我发送 imageUrl 来生成响应时,此函数可能尚未准备好。

最佳答案

请注意,此答案是针对 the original question 编写的而不是 OP 稍后进行的编辑。

<小时/>

async 函数是异步的。其他功能不会等待。

因此,您调用 sendTextMessage,它又调用 callSendAPI,然后程序的其余部分继续执行。

callSendAPI 异步运行。它调用 request 并等待 request 返回的 Promise 得到解析。解析完成后,callSendAPI 会获取 request 的返回值(好吧,如果您捕获了返回值,就会如此),然后继续下一行(只有不是下一行)。

<小时/>

async/await 不会使异步代码同步。他们只是让它看起来像在声明为async的函数内部,它本身就变成了异步。

<小时/>

您可以将三个函数调用放入各自的 async 函数中,确保每个函数都返回一个 Promise,然后使用 await 调用这三个函数中的每一个。

<小时/>

另请参阅How do I return the response from an asynchronous call? .

关于javascript - 异步等待无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50423873/

相关文章:

javascript - 使用 JavaScript 两次(或多次)插入 HTML 元素

javascript - 如果页面中不存在 DOM 元素,我如何移动到下一个迭代?

javascript - socket.io - 用一个数据包监听多个命名空间?

bash - 无法停止我在 Debian squeeze 上的启动脚本

javascript - 在 Firebase 中处理多个 URL 以供引用?

javascript - Parse.com 循环内的 Javascript 异步调用

javascript - 单击 PayPal 购买按钮时如何显示 Window.alert

javascript - CSS如何让div充满所有的垂直空间

asynchronous - Asp.Net Web API, 'async Task' 或 'async void' 作为返回类型

ios - 如何知道其他线程中的任务何时完成?