我是承诺和蓝鸟的新手,在我目前的项目中,我必须处理很多异步API调用,因此我想使用JS promise作为我的主要工具。 我导入的模块之一如下所示:
var Promise = require("bluebird");
var watson = Promise.promisifyAll(require('watson-developer-cloud'));
var conversation = watson.init();
exports.enterMessage = function (inputText) {
var result; //want to return
conversation.message({
input: {
"text": inputText
}
}, function(err, response) {
if (err) {
console.log('error:', err);
result = err;
}
else {
result = response.output.text;
}
});
console.log(result); //sync call, result === undefined
return result;
}
我的问题是我该如何处理这个问题?我理解关于使用IO的承诺的例子,比如fs。所以我尝试通过conversation.message(...).then(function(response){result = response.output.text})
模仿方式,但是它表示conversation.message(...)。then()没有定义。
答案 0 :(得分:2)
感谢 jfriend00 的链接,我修复了逻辑并使用正确的方法处理此异步调用。
这是固定代码:
//app.js
var Promise = require("bluebird");
var conversation = Promise.promisifyAll(require('./watson-conversation'));
conversation.enterMessage(currentInput).then(function(val){
res.send(val)}
).catch(function(err){
console.log(err)
});
});
//watson-conversation.js
var conversation = watson.init();
exports.enterMessage = function (inputText) {
return new Promise(function(resolve, reject){
conversation.message({
input: {
"text": inputText
}
}, function(err, response) {
if (err) {
console.log('error:', err);
reject(err);
}
else {
resolve(response.output.text);
}
});
});
}