如何将发现与对话集成?我正在使用NodeJS,但遇到问题,因为我希望在查询我的数据收集后,会话结果。我正在尝试使用回调但没有运气。我可以使用异步,但在这种情况下我可以使用简单的回调吗?帮助表示感谢,谢谢!
function updateMessage(res, data) {
if (!data.output) {
data.output = {};
} else {
/* THIS CODE RETURNS CONVERSATION DATA FIRST, CAUSING THE DISCOVERY QUERY
TO BECOME UNDEFINED */
if (data.context.callDiscovery === true) {
//Query collection
Discovery.query(params, function(error, results) {
data.output.text = "Getting what you need";
//Set output graph card
data.output.graph = {
title: results.title,
url: result.url,
description: results.passage_text
};
return results;
});
}
return data;
}
}
答案 0 :(得分:3)
您正在混合同步和异步操作。
以下是同步返回的函数示例:
function (options) {
if (options.flag) {
return "Flag is set";
} else {
return "Flag is not set";
}
}
这是异步返回的函数示例:
function (options, done) {
Discovery.query({options}, function (err, results) {
if (err) return done(err);
return done(null, results);
});
}
但是,不建议根据条件立即返回接受回调的函数或执行异步操作然后返回。如果您的函数没有进行回调并且在异步操作完成时没有调用该回调,那么您的函数将在异步操作完成之前完成。例如:
function mixedUp(options) {
Discovery.query({options}, function (err, results) {
if (err) return err;
return results;
});
return 'default value';
}
这将始终返回默认值,因为在Discovery请求完成之前,您的函数已返回。
你应该让你的函数接受一个回调或一个完成的参数,在惯用节点中,它是你函数的最后一个参数。 function (options, moreOptions, done/callback/cb)
应该是您的功能的签名。然后,当您想要执行操作时,您的函数应该调用该回调函数。
function updateMessage(res, data, done) {
if (!data.output) {
data.output = {};
return done(null, data);
} else {
/* THIS CODE RETURNS CONVERSATION DATA FIRST, CAUSING THE DISCOVERY QUERY
TO BECOME UNDEFINED */
if (data.context.callDiscovery === true) {
//Query collection
Discovery.query(params, function(error, results) {
data.output.text = "Getting what you need";
//Set output graph card
data.output.graph = {
title: results.title,
url: result.url,
description: results.passage_text
};
return done(null, results);
});
} else {
return done(null, data);
}
}
}