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

时间:2017-12-20 05:53:58

标签: javascript

以下代码不会在控制台中显示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可能会以某种方式提供帮助吗?

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

3 个答案:

答案 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 = '');
});