如何使用"这个"在回调中?

时间:2017-04-15 23:18:48

标签: javascript node.js alexa-skills-kit

我在下面的代码中在url的另一端有一个rest服务,它返回s3存储桶中所有对象的名称。我试图创建一个简单的Alexa技能,告诉我该桶中有多少个对象。我的问题是在http get请求中的术语"这个"不引用与http get请求之外的相同内容。我怎样才能使用"这个"在get请求中或返回" count"来自我的http get请求的变量?

"use strict";
var Alexa = require("alexa-sdk");
var Client = require('node-rest-client').Client;

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.registerHandlers(handlers);
    alexa.execute();
};

var handlers = {
    'Launch Request': function() {
        this.emit('CountItems');
    },
    'ContentsIntent': function() {
        this.emit('CountItems');
    },
    'CountItems': function() {
        var client = new Client();
        var count = undefined;
        client.get("URL", function (data, response) {
            console.log(data['Keys'].length);
            count = data['Keys'].length;
        });
        this.emit(':tell', 'There are ' + count + ' items in your s3 bucket.');
    }
};

2 个答案:

答案 0 :(得分:1)

这取决于您想要的this值。如果你希望它是client.get()调用之前的值,那么通常的方式(在ES6之前)只是将它的值保存到client.get()之前的局部变量中,然后引用它保存值而不是this。此外,您可以使用计数的唯一地方是回调内部,因此您必须将.emit()放在其中:

var handlers = {
    'Launch Request': function() {
        this.emit('CountItems');
    },
    'ContentsIntent': function() {
        this.emit('CountItems');
    },
    'CountItems': function() {
        var client = new Client();
        var self = this;
        client.get("URL", function (data, response) {
            let count = data['Keys'].length;  
            self.emit(':tell', 'There are ' + count + ' items in your s3 bucket.');
        });
    }
};

您还可以使用.bind()

var handlers = {
    'Launch Request': function() {
        this.emit('CountItems');
    },
    'ContentsIntent': function() {
        this.emit('CountItems');
    },
    'CountItems': function() {
        var client = new Client();
        client.get("URL", function (data, response) {
            let count = data['Keys'].length;  
            this.emit(':tell', 'There are ' + count + ' items in your s3 bucket.');
        }.bind(this));
    }
};

在ES6(node.js的现代版本)中,您可以使用箭头函数定义回调,并在回调中使用this的词法值:

var handlers = {
    'Launch Request': function() {
        this.emit('CountItems');
    },
    'ContentsIntent': function() {
        this.emit('CountItems');
    },
    'CountItems': function() {
        var client = new Client();
        client.get("URL", (data, response) => {
            let count = data['Keys'].length;  
            this.emit(':tell', 'There are ' + count + ' items in your s3 bucket.');
        });
    }
};

在ES6环境中,大多数人发现箭头功能是最干净的做事方式。

答案 1 :(得分:0)

变量 count 应该在闭包的内部和外部都可用。 如果你想在get-closure范围内使用 this 的外部上下文,你可以这样做:

var that = this;
client.get("URL", function (data, response) {
        console.log(data['Keys'].length);
        count = data['Keys'].length;
        that.emit(':tell', 'There are ' + count + ' items in your s3 bucket.');
});