【问题标题】:Changing the value of a property of an object inside a function in java script doesn't work as it should在 javascript 的函数中更改对象的属性值不能正常工作
【发布时间】:2018-03-17 21:10:57
【问题描述】:

我有两个模块,在第一个模块中我声明了一个对象,因为我知道原语在 java 脚本中通过值传递,对象通过引用传递。我想从请求中获取响应状态,并且我将对象传递为一个引用,这样我就可以修改它的属性。问题是它没有做任何事情。最终值将是相同的。

//this code is in a different module from the other one
var variableToBeChanged = { something : "Initial value" };
anotherModule.changeValue(variableToBeChanged);
alert(variableToBeChanged.something);

//and in the other module I have a $.ajax and I want to get the response status(ex. 200)

//the code is sth like this:

function AnotherModule(ajax){

  function changeValue(variableToBeChanged){
    ...
    ...
    ...
    $.ajax({
      ...
      ...
      ...
      success: function(data,xhr){
          variableTobechanged.something = xhr.status;
      }
    });
  }

}

最后它将显示:“初始值”而不是 200 或其他任何内容。 我在这里做错了什么?

【问题讨论】:

  • 变量异步更改,因此您必须使用承诺或回调来访问新值

标签: javascript pass-by-reference multi-module


【解决方案1】:

在 javascript 中传递了对对象的引用副本。

这意味着对对象所做的任何更改都将在函数执行完成后对您可见。

由于 javascript 是异步的,因此 alert(variableToBeChanged.something) 这行代码会在你的函数返回之前执行。因此,您会看到 old value 。您必须使用回调或承诺同步工作。

请参考这个问题javascript pass object as reference。它很好地解释了这个概念。

【讨论】:

    【解决方案2】:

    ajax 调用是异步,因此在修改变量之前调用警报。您可以像这样在 ES6 中使用 promise 来确保它在 ajax 调用完成后执行。

        new Promise((resolve) =>{ 
                 anotherModule.changeValue(variableToBeChanged);
                 resolve();
            }).then((res) =>{
                alert(variableToBeChanged.something);
            }).catch((error) =>{
                alert(error);
        });
    

    【讨论】:

    • 在您的情况下,您还可以考虑返回 ajax() 返回的延迟对象并在其上使用 done 或 fail 方法,因为您似乎对调用成功还是失败感兴趣模块。 See The jqXHR Object.
    • 嗨@Stefan,是的,我们可以在成功或失败的情况下从ajax调用返回一个对象,并相应地解决或拒绝promise。
    • 感谢您的评论!我有一个问题:使用 jQuery.ajaxSetup({ async : false} ) 和 jQuery.ajaxSetup({ async : true} 是不好的做法吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2018-09-27
    • 2013-05-24
    • 2010-11-07
    相关资源
    最近更新 更多