是否可以从另一个嵌套的箭头函数访问箭头函数的参数?

时间:2019-08-03 04:43:53

标签: javascript node.js amazon-dynamodb actions-on-google arrow-functions

我正在尝试为Google Assistant建立一个后端Webhook,以从DynamoDB中读取记录。

这是我的代码:

// Handle the Dialogflow intent named 'trip name'.
// The intent collects a parameter named 'tripName'.
app.intent('trip name', (conv, {tripName}) => {

    const dynamoDb = IS_OFFLINE === true ?
        new AWS.DynamoDB.DocumentClient({
            region: 'ap-south-1',
            // endpoint: 'http://127.0.0.1:8080',
        }) :
        new AWS.DynamoDB.DocumentClient({
            region: 'ap-south-1',
            // endpoint: 'http://127.0.0.1:8080',
        });


        const params = {
            TableName: ACTIVITIES_TABLE
            Key: {
                'name':tripName
            }
        };

        // conv.close('error retrieving!'); THIS WORKS
        dynamoDb.get(params, (error, result) => {
            // conv.close('error retrieving!'); THIS DOES NOT

            if (error) {
                conv.close('error retrieving!');
            }
            else {
                conv.close(JSON.stringify(result, null, 2));
            }
        });
});

如果我要从DynamoDB函数外部使用conv,则可以使用,但是从内部不能使用,并且返回此错误:

  

2019-08-03T03:56:22.521Z **错误错误:未设置响应。这是在异步调用中使用的吗   没有作为对意图处理程序的承诺返回?

我得出的结论是,也许不允许我从另一个嵌套的箭头函数访问箭头函数自变量?

我正在使用Actions on Google Client Library

1 个答案:

答案 0 :(得分:2)

问题与从另一个箭头功能访问参数无关-完全允许。

问题是,如错误消息所提示,您正在使用异步函数(该函数需要callback0,但不返回Promise对象。Google行动库要求您返回如果您正在执行任何异步操作,请从您的Intent Handler中获取一个Promise,以便它知道等待这些操作完成。

您需要从呼叫中使用回调到dynamoDb.get()切换为使用Promise。为此,您不需要包括回调函数,因此get()返回一个AWS.Request对象。该对象具有promise()方法,因此您可以使用此方法从Promise and then() chain返回结果。 (并且您必须返回此Promise。)

在您的情况下,可能看起来像这样

    return dynamoDb.get(params).promise()
      .then( result => {
        conv.close(JSON.stringify(result, null, 2));
      })
      .catch( error => {
        conv.close('error retrieving!');
      });