下面的代码不会在控制台中显示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可以帮助某种程度?
注意,这个例子不是现实代码,它只是一个突出问题的例子。在现实生活中,我无法删除最后一行。
因为你说“你不删除变量”然后你可以做的一切就是复制数据。它可以通过额外的自调用函数以更优雅的方式完成:
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 = '';
但要小心:这仅适用于原始类型和完整的重新分配对象,但不适用于对象内部的更改(或数组,因为它们也是对象)。对于他们,您将需要明确克隆它们
不,你不能,因为你以后再次重新分配变量。一种可能性是你可以在分配之前复制它。
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 = '';
对于对象,您必须克隆不同于基元。
另一种可能性是使用承诺。虽然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 = '');
});