Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript处理异步回调node.js_Javascript_Node.js_Async Await_Webhooks_Async.js - Fatal编程技术网

JavaScript处理异步回调node.js

JavaScript处理异步回调node.js,javascript,node.js,async-await,webhooks,async.js,Javascript,Node.js,Async Await,Webhooks,Async.js,我是Javascript新手,刚刚被使用Node.js的Javascript异步回调卡住了 我首先设置了Facebook的webhook并发出了一个webhook帖子请求 这是我的密码: routes.js **To set up facebook webhook** var facebook_handler = require('../controllers/botkit').handler module.exports = function (app) { // public pag

我是Javascript新手,刚刚被使用Node.js的Javascript异步回调卡住了

我首先设置了Facebook的webhook并发出了一个webhook帖子请求

这是我的密码: 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')
  })
}
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.
     }
   }
}
从上面的代码中,我向FacebookWebhook发出POST请求,获取FB消息的详细信息,然后在另一个文件BotKit.js中处理webhook POST请求

Botkit.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')
  })
}
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请求不会执行。翻译帖子请求总是在Webhook帖子完成后执行

在Webhook POST请求完成之前,是否有办法在Webhook POST请求中执行Translator POST请求

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

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

其次,您的
translatorEnglish
函数既没有
回调
,也不是
承诺
。因此,没有人会等待它的异步函数调用(
languageTranslator.translate
)完成。因此,您应该将其更改为一种格式或回调格式(也可以使用类似于promise的异步等待格式)

第三,无论如何,
translatorEnglish
函数将是一个异步函数,您希望在
handle
函数中的for循环中使用它,这意味着您可能需要等待多个异步函数,这使得使用回调处理起来很困难。所以我建议你在这种情况下使用承诺,为了等待所有承诺完成,你可以使用承诺 功能

别忘了,您应该让所有这些函数承诺并在
facebook\u handler()中调用
res.send
。然后调用
函数

附加服务

  • 如果您想将带有回调的函数转换为promise而不更改其实现(promisify),则可以使用node 8或bluebird函数

  • 看看问题和答案


如果问题不清楚,请告诉我