【问题标题】:Async issue on nodejs POST requestnodejs POST请求上的异步问题
【发布时间】:2017-01-11 22:46:44
【问题描述】:

我正在尝试在发布请求中应用自定义函数,但它返回未定义。

我知道这是某种异步问题,但我无法弄清楚可能是什么问题。

问题所在的代码块

console.log(text); // <---- This shows correct value
A.prepare(function (text) { 
    console.log(text) // <---- This shows undefined
    B.write(text, function (response) {
        sendTextMessage(sender,response.message)
        return response.message;
    });
});

完整代码

app.post('/webhook/', function (req, res) {
    // addPersistentMenu();
    let messaging_events = req.body.entry[0].messaging;
    for (let i = 0; i < messaging_events.length; i++) {
        let event = req.body.entry[0].messaging[i];
        let sender = event.sender.id;
        if (event.message && event.message.text) {
            let text = event.message.text;
            console.log(text);
            A.prepare(function (text) {
                B.write(text, function (response) {
                    sendTextMessage(sender,response.message)
                    return response.message;
                });
            });   
        }
        if (event.postback) {
            let text = JSON.stringify(event.postback);
            sendTextMessage(sender, "Postback received: "+text.substring(0, 200));
            continue;
        }
    }
    res.sendStatus(200)
});

【问题讨论】:

  • 因为那是一个回调函数。您只是为第一个参数提供名称文本。并且不将文本的值传递给函数。
  • 你想传入test的哪个值` B.write(text, function (response) {`?
  • @abdulbarik 我想传递 event.message.text

标签: javascript node.js express callback promise


【解决方案1】:

这是一个范围问题,而不是异步问题。

排队

A.prepare(function (text) {

text实际上是传递给函数的参数,并在函数本身内部使用。它不是指您在上面一行中登录的文本。

【讨论】:

  • 知道如何解决吗?我试着把它包装在一个外部函数上,也没有用。
  • 只需从A.prepare 回调中删除/重命名text 参数
  • 如果我不需要它,我会删除 A.prepare,但我需要该功能。
【解决方案2】:

更新

您将获得text 值作为undefined,因为您在callback function 中访问它。 而且您还在callback function 中给出了text 参数。而Priority always goes to local 这意味着每次您都会获得text 的本地值,即 undefined 现在。 您必须更改其中一个变量名称。

由于我已将text 更改为text1,现在您可以在callback function 中获得text1

如果你想在A.prepare()函数中传递变量,你可以根据需要添加多个参数。

像这样:

A.prepare(param1,param2,param3,...,function(text){
    //Do your stuff
})

这是你更新的代码:

app.post('/webhook/', function(req, res) {
    //  addPersistentMenu();
    let messaging_events = req.body.entry[0].messaging;
    for (let i = 0; i < messaging_events.length; i++) {
        let event = req.body.entry[0].messaging[i];
        let sender = event.sender.id;
        if (event.message && event.message.text) {
            let text1 = event.message.text;
            console.log(text1);
            A.prepare(function(text) {
                B.write(text1, function(response) {
                    sendTextMessage(sender, response.message)
                    return response.message;
                });
            });


        }
        if (event.postback) {
            let text = JSON.stringify(event.postback);
            sendTextMessage(sender, "Postback received: " + text.substring(0, 200));
            continue;
        }
    }
    res.sendStatus(200)
});

【讨论】:

  • 我也想将变量传递给 A .. 另外我的代码和你的有什么区别?
  • 答案只包含代码,不解释您所做的更改或问题总是可以通过包含一些解释来改善。此外,它们使快速阅读者很难从您的答案中获得任何有用的信息,而无需详细比较您的代码与原始代码。请添加说明。
  • @jfriend00 感谢您的建议,是的,永远都会这样做。一个解释清楚的答案将帮助所有有需要的用户
  • 所以,我以为你会为这个答案添加解释(你可以使用“编辑”链接来修改你的答案)。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2014-09-12
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多