方法的XMLHttpRequest后不会被调用完成

问题描述:

我有以下方法登录到我的API:方法的XMLHttpRequest后不会被调用完成

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和请求状态是正确的。

有没有更好的方法来做到这一点?或者我做错了什么?

谢谢

这是因为你正在返回一个函数,而不是只调用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(); 
    } 
}); 
+0

这不起作用,因为onreadystatechange回调的上下文中的“this”是XMLHttpRequest,而不是我的类。 – Peter

+0

好的,更新它来捕获'this'上下文,以便在'that'的函数内可用。 – rasmeister

还记得 “这个”,在登录()不作为(函数内部的一个,则这个(){如果....}),所以你需要以rasmeister显示的方式保存这个var = this。