JavaScript处理异步回调node.js
我是Javascript新手,刚刚被使用Node.js的Javascript异步回调卡住了 我首先设置了Facebook的webhook并发出了一个webhook帖子请求 这是我的密码: routes.jsJavaScript处理异步回调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
**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函数
- 看看问题和答案
如果问题不清楚,请告诉我