在异步函数中,如何正确访问父变量

问题描述 投票:2回答:3

下面的代码不会在控制台中显示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可以帮助某种程度?

注意,这个例子不是现实代码,它只是一个突出问题的例子。在现实生活中,我无法删除最后一行。

javascript
3个回答
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 = '';

但要小心:这仅适用于原始类型和完整的重新分配对象,但不适用于对象内部的更改(或数组,因为它们也是对象)。对于他们,您将需要明确克隆它们


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
投票

另一种可能性是使用承诺。虽然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 = '');
});
© www.soinside.com 2019 - 2024. All rights reserved.