异步等待无法正常工作

2023-12-03

我是 JavasSript 的新手async, await and promise特征。

我正在做的是,

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生成响应。


请注意,这个答案是针对原来的问题而不是OP后来进行的编辑。


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

所以你打电话sendTextMessage哪个调用callSendAPI然后程序的其余部分继续进行。

callSendAPI异步运行。它调用request并等待返回的承诺request有待解决。当事情解决之后,callSendAPI获取返回值request(好吧,如果您捕获了返回值,就会发生),然后继续下一行(只是没有下一行)。


async / await不要使异步代码同步。他们只是让它看起来像inside函数声明为async它本身变得异步。


您可以将三个函数调用放在一个async函数,确保每个函数都返回一个 Promise,然后使用以下命令调用这三个函数中的每一个await.


也可以看看如何从异步调用返回响应?.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步等待无法正常工作 的相关文章