JavaScript处理异步回调节点.js

问题描述 投票:-1回答:1

我是Javascript的新手,刚刚使用Node.js陷入了使用Javascript的异步回调。

我首先设置Facebook webhook并发出Webhook POST请求

这是我的代码:routes.js

**To set up facebook webhook**

var facebook_handler = require('../controllers/botkit').handler

module.exports = function (app) {
  // public pages=============================================
  // root
  app.get('/', function (req, res) {
    res.render('home')
  })

  app.get('/webhook', function (req, res) {
    // Check to see which webhook password (FACEBOOK_VERIFY_TOKEN) to check for, from incoming request.
    if (process.env.PORT ||process.env.VCAP_APP_PORT ) {
      FB_VERIFY_TOKEN = process.env.FACEBOOK_VERIFY_TOKEN
    } else {
      FB_VERIFY_TOKEN = process.env.FACEBOOK_VERIFY_TOKEN_DEV
    }
    // This enables subscription to the webhooks
    if (req.query['hub.mode'] === 'subscribe' && req.query['hub.verify_token'] === FB_VERIFY_TOKEN) {
      res.send(req.query['hub.challenge'])
    }
    else {
      res.send('Incorrect verify token')
    }
  })

  app.post('/webhook', function (req, res) {
    console.log("\n CALL HANDLER FUNCTION ---- \n");
    facebook_handler(req.body)
    console.log("call handler done");
    res.send('okay')
  })
}

从上面的代码,我向Facebook webhook发出POST请求并获取FB消息的详细信息,然后在另一个文件BotKit.js中处理webhook POST请求

Botkit.js

var request = require('request');
require('dotenv').load();

var handler = function (obj) {
console.log("Message received from FB \n");

  if (obj.entry ) {
    for (var e = 0; e < obj.entry.length; e++) {
           for (var m = 0; m < obj.entry[e].messaging.length; m++) {
                var facebook_message = obj.entry[e].messaging[m]
                test_message = facebook_message.message.text;
                translatorEnglish (test_message) // calling the watson translator api to get translation for the received facebook message.
     }
   }
}

上面的代码进程webhook POST请求并调用转换器函数(转换POST请求)

翻译功能

  var translationusername = "1234"
  var translationpassowrd = "1234"
  var transURL = "https://gateway.watsonplatform.net/language- 
  translator/api/v2/translate";

  translatorEnglish = function(test_message) {
           console.log("this should be called when translator called:" +test_message);
            var parameters = {
             text: test_message,
              model_id: 'es-en'
            };
            languageTranslator.translate(
              parameters,
              function(error, response, body) {
                if (error)
                  console.log(error)
                else
                  english_message = response.translations[0].translation
                  console.log("The response should be:" +english_message);
                  translate = false
                  //console.log(JSON.stringify(response, null, 2));
              }
            );
          };

问题是直到Call Handler即webhook POST请求完成后才会执行转换POST请求。 Webhook POST完成后,转换POST请求始终执行。

在Webhook POST请求完成之前,我是否可以在Webhook POST请求中执行Translator POST请求。

像这样的Webhook POST - >执行 - >翻译POST执行并完成---> Webhook POST完成

javascript node.js async-await webhooks async.js
1个回答
-1
投票

首先,languageTranslator.translate函数是一个异步函数,因此它返回并且不等待它的回调完成。因此,如果您想确保回调已完成,则应在完成后使用新的回调或promise.then函数执行下一个命令。

其次,你的translatorEnglish功能既没有callback,也没有promise。因此,没有人等待其异步函数调用(languageTranslator.translate)完成。因此,您应该将其更改为promise格式或回调格式(您也可以使用async await格式,就像promise一样)。

第三,无论如何,translatorEnglish函数将是一个异步函数,你想在handle函数的for循环中使用它,这意味着你可能有多个异步函数等待,这使得很难使用回调来处理它。所以我建议你在这种情况下使用promise,为了等待所有的promises完成,你可以使用Promise.all函数。

不要忘记,你应该让所有这些函数承诺并在res.send函数中调用facebook_handler().then

演员:

  • 如果要将带回调的函数转换为promise而不更改其实现(promisify),可以使用节点8 util.promisify或bluebird Promise.promisify函数。
  • 看看this的问题和答案。
© www.soinside.com 2019 - 2024. All rights reserved.