我在下面的代码中在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.');
}
};
答案 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.');
});