完成XMLHttpRequest后未调用类中的方法

时间:2017-02-20 02:04:07

标签: javascript asynchronous typescript xmlhttprequest

我有以下方法登录我的API:

login()
{
    var formData = new FormData();

    formData.append("admin[email]", "user");
    formData.append("admin[password]", "pass");

    var request = new XMLHttpRequest();
    request.open("POST", "my_link");

    request.onreadystatechange = (function() {
      if (request.readyState === XMLHttpRequest.DONE && request.status === 201)
      {
        return function() { this.loadMembers(); }
      }
    });

    request.send(formData);
  }

然后我有我的方法,我试图在我的帖子异步请求完成后调用:

loadMembers()
{
    ....
}

由于某种原因,永远不会调用this.loadMembers()。如果我在它上面放置一个测试console.log()(不在返回回调中),它调用就好了 - 所以我知道requestState和请求状态是正确的。

有更好的方法吗?或者我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

这是因为你正在返回一个函数,而不是只调用loadMembers。

所以而不是:

request.onreadystatechange = (function() {
  if (request.readyState === XMLHttpRequest.DONE && request.status === 201)
  {
    return function() { this.loadMembers(); }
  }
});

你可能想要:

var that = this;
request.onreadystatechange = (function() {
  if (request.readyState === XMLHttpRequest.DONE && request.status === 201)
  {
    that.loadMembers();
  }
});

答案 1 :(得分:0)

记住"这个"在login()中它与(function(){if ....}中的那个不一样)所以你需要以rasmeister显示的方式保存这个var = this。