以下代码不会在控制台中显示Hello
。如何正确访问异步函数中的someVariable
?
var someVariable = 'Hello';
$.get('ajax/test.html', function(data) {
console.log(someVariable); // Want it to be 'Hello', but it's not.
});
someVariable = '';
这是ES5代码。如果用ES5修复不是很简单,那么ES6可能会以某种方式提供帮助吗?
注意,该示例不是现实代码,它只是一个突出问题的示例。在现实生活中,我无法删除最后一行。
答案 0 :(得分:3)
不,你不能,因为你以后再次重新分配变量。一种可能性是你可以在分配之前复制它。
var someVariable = 'Hello';
$.get('ajax/test.html', function(data) {
console.log(temp); // Want it to be 'Hello', but it's not.
});
var temp = someVariable;
someVariable = '';
对于对象,您必须克隆不同于基元。
答案 1 :(得分:1)
既然你说“你没有删除变量”那么你可以做的一切就是复制数据。它可以通过额外的自调用函数以更优雅的方式完成:
var someVariable = 'Hello';
(function (copiedData) {
$.get('ajax/test.html', function(data) {
console.log(copiedData); // Want it to be 'Hello', but it's not.
});
})(someVariable);
someVariable = '';
但要小心:这仅适用于原始类型和完整的重新分配对象,但不适用于对象内部的更改(或数组,因为它们也是对象)。对于他们,您将需要明确克隆它们
答案 2 :(得分:1)
另一种可能性是使用承诺。虽然Suresh有一个非常简单的解决方案。
let someVariable = 'Hello';
let myFirstPromise = new Promise((resolve, reject) => {
$.get('ajax/test.html', function(data) {
resolve(console.log(someVariable));
});
});
myFirstPromise.then((successMessage) => {
console.log(someVariable = '');
});