【问题标题】:How can I promisify Watson Assistant functions to allow async/await in node?如何承诺 Watson Assistant 功能以允许节点中的异步/等待?
【发布时间】:2018-09-26 08:05:33
【问题描述】:

根据 Watson Assistant API 文档,回调用于返回响应。以下是取自他们的API Documentation 的示例:

var watson = require('watson-developer-cloud');

var assistant = new watson.AssistantV1({
  username: '{username}',
  password: '{password}',
  version: '2018-02-16'
});

var params = {
  workspace_id: '9978a49e-ea89-4493-b33d-82298d3db20d',
  intent: 'hello'
};

assistant.listExamples(params, function(err, response) {
  if (err) {
    console.error(err);
  } else {
    console.log(JSON.stringify(response, null, 2));
  }
});

我希望尝试并承诺这个函数,以便我可以将进程转换为一个漂亮、整洁的异步/等待进程并摆脱回调地狱。我在AWS Lambda 上托管并执行此代码。他们最近在 Lambda 上发布了 node8.10 运行时,所以我渴望使用 async/await 转换我现有的所有函数。

以下是我的尝试(已替换敏感数据):

var Watson = require('watson-developer-cloud');
var util = require('util');

var assistant = new Watson.AssistantV1({
    username: "username",
    password: "password",
    version: "2018-02-16"
});

var params = {
    workspace_id: "workspace_id",
    intent: "acronym"
};

var watsonPromise = util.promisify(assistant.listExamples);

exports.handler = async (event) => {
    try {
        var examples = await watsonPromise(params);
        return examples;
    } catch (err) {
        console.log(err);
        return err;
    }
}

这似乎不起作用,我收到以下错误:

START RequestId: 4f203ed1-4181-11e8-81ec-837163404af0 Version: $LATEST
2018-04-16T14:20:27.792Z    4f203ed1-4181-11e8-81ec-837163404af0    TypeError: Cannot read property '_options' of undefined
    at AssistantV1.listExamples (/var/task/node_modules/watson-developer-cloud/assistant/v1.js:761:51)
    at internal/util.js:230:26
    at exports.handler (/var/task/index.js:21:30)
END RequestId: 4f203ed1-4181-11e8-81ec-837163404af0

经过一番挖掘,我的examples 对象似乎显示为undefined

任何人都可以提供任何建议吗?不太确定我还能做什么。我想念的可能很简单。谢谢。

【问题讨论】:

    标签: node.js amazon-web-services promise async-await watson-conversation


    【解决方案1】:

    您可以将函数绑定到正确的上下文

    var watsonPromise = util.promisify(assistant.listExamples.bind(assistant));
    

    或调用具有正确上下文的承诺版本

    var examples = await watsonPromise.call(assisntant, params);
    

    【讨论】:

    • 哇,谢谢。知道这将是一件简单的事情。似乎工作:)
    • 如果你能分享为什么这行得通,为什么我的行不通,那就太好了。很想(尝试)了解发生了什么。
    • @blueprintChris AssistantV1#listExamples 和其他方法都是很好的方法,因此需要在AssistantV1 实例的上下文中调用它们(因此this 必须是实例本身)。如果将函数保存到变量并稍后调用它,则会丢失上下文。您可以在 javascript here 中阅读有关 this 关键字的更多信息
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多