回调和异步功能

时间:2017-10-02 20:23:32

标签: javascript node.js watson-conversation watson

如何将发现与对话集成?我正在使用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;
  }
}

1 个答案:

答案 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);
    }
  }
}