2013-10-02 79 views
0

我的班级看起来像javascript和执行功能的顺序

function classUser() { 
    var userName; 
    var firstName; 
    var lastName; 
    var sessionid; 
} 

classUser.prototype.set_user_name = function (user_name) { 
    this.userName = user_name; 
} 

classUser.prototype.set_first_name = function (first_name) { 
    this.firstName = first_name; 
} 

classUser.prototype.set_last_name = function (last_name) { 
this.lastName = last_name; 
} 

classUser.prototype.get_curr_session = function() { 
    return this.sessionid; 
} 

classUser.prototype.save = function() { 

    $.ajax({ 
     type: "POST", 
     url: "http://myapihost.com:8080/api/1.0/user/", 
     data: JSON.stringify(this), 
     dataType: "json", 
     success: function (apiResponse) { 
      var currSessionID = apiResponse.sessionId; 
      this.sessionid= currSessionID; 
     }, 
     error: function (apiResponse) { 
      alert("error : " + apiResponse); 
      this.sessionid= "Error"; 
     } 
    }); 
} 

我有时叫他们为

var User = new classUser(); 
    User.set_first_name(userFirstName); 
    User.set_last_name(response.last_name); 
    User.set_user_name(response.username); 

    User.save(); 
    var currSessionID = User.get_curr_session(); 

,get_curr_session被成功之前调用:调用。

问题: 我试着从成功本身返回sessionid,以便save()函数完成这项工作。这不起作用。因此我分裂了2个功能。

我可以在一次通话中完成吗?如果我使用2个功能 - 我如何确保它始终有效。

我实际上可以把currSessionID分配给成功,但是破坏了类的神圣性。我已经看到其他解决方案,如使用“完成”,不知道这是否会在这里帮助。

=======================================

我修改了代码如下

classUser.prototype.save =函数(回调){

$.ajax({ 
    type: "POST", 
    url: "http://myapihost.com:8080/api/1.0/user/", 
    data: JSON.stringify(this), 
    dataType: "json", 
    success: function (apiResponse) { 
     var currSessionID = apiResponse.sessionId; 
     this.sessionid= currSessionID; 
     callback(null, currSessionID); 
    }, 
    error: function (apiResponse) { 
     alert("error : " + apiResponse); 
     this.sessionid= "Error"; 
     callback("error", null); 
    } 
}); 
} 

当我打电话

User.save(mycallback); 


function mycallback(error, sessId){ 
    if(error) { 
     console.log("Some error occurred. Check code"); 
     return;// Something went wrong 
    } else { 
     console.log("Session : " + sessId); 
    } 
} 

现在这是好?

感谢 阿贾伊

+0

[如何从AJAX调用返回响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Phil

+0

我不认为'classUser'中的'var'声明做你认为他们做的事。 – user2357112

+0

是什么意思?他们完全按照我的意愿去做:) –

回答

3

这是因为ajax请求的成功和错误函数是异步执行的。

为了确保不会发生这种情况,您应该将回调添加到在成功或错误功能运行后调用的保存函数中。

classUser.prototype.save = function (callback) { 

    $.ajax({ 
     type: "POST", 
     url: "http://myapihost.com:8080/api/1.0/user/", 
     data: JSON.stringify(this), 
     dataType: "json", 
     success: function (apiResponse) { 
      var currSessionID = apiResponse.sessionId; 
      this.sessionid= currSessionID; 
      callback(null, currSessionID); 
     }, 
     error: function (apiResponse) { 
      alert("error : " + apiResponse); 
      this.sessionid= "Error"; 
      callback(apiResponse, null); 
     } 
    }); 
} 

然后调用保存功能时,你可以做这样的事情:

User.save(function(error, sessId) { 
    if(error) { 
     // Something went wrong 
    } else { 
     // Do whatever you need to do 
    } 
}); 

你应该注意,这也将异步运行。因此,如果您想使用会话ID,请不要在User.save(...)调用之后,而是在函数内部执行此操作。

+0

我认为这是我需要的。但是,我在哪里定义回调函数? (我以前没用过)。现在它说回调未定义。 –

+0

@ThoughtfulMonkey你通过它作为参数传递给你的'save'功能无论是作为一个匿名函数就像你在你的'success' /'error'回调,你一个_reference_到现有的命名函数做。 –

+0

我添加了一些代码。请让我知道,如果这是正确的方式去做。 –

0

$.ajax()问题在选项中指定的网址异步调用对象。请参阅jQuery文档http://api.jquery.com/jQuery.ajax/

success是一个回调函数,当调用完成并且浏览器读取所有响应流时,基本上在大多数情况下会执行回调(更新会话标识)在您尝试检索它之后。

+1

的'success'回调当前_execution flow_之后总是被调用(如写'的setTimeout(函数(){....},0);')如果是'VAR之前以某种方式执行currSessionID = User.get_curr_session( );'那么我会认为它是一个错误,因为它在'async'调用应该/如何工作中发生冲突。 –

+0

你说得对。我正在考虑使用'cache:true'调用'$ .ajax()'的可能性,并认为浏览器不会发出异步请求,而是提供缓存版本,从而同步执行。至少这是.NET任务的工作方式,我推断为JS承诺,但我很可能是错误的;) – DenisPostu

+0

同样使用_cached_它应该在当前执行流程之后调用。 [承诺/ A +](http://promises-aplus.github.io/promises-spec/)'[...]这一要求可确保onFulfilled和onRejected异步执行,后事件循环依次其然后被称为[ ...]'jQuery在代码中有不同的部分来确保这个例如'//(IE6 IE7及),如果它在缓存中,并已获取的直接需要我们开火,他们使用'的setTimeout(回调)的callback';''如果是api'定义为异步应该总是表现得这样(或提供一个参数/备选方案使其同步)。 –

0

我觉得这里发生了什么是默认的Ajax调用异步这意味着success调用完成之前的代码var currSessionID = User.get_curr_session();可以执行。

你有几个选项,你可以尝试更新您的代码更能够异步使用回调或其他方法,或指定您希望您的Ajax调用是同步的。

+0

你不应该建议让Ajax调用'synchronous',因为这可能/将比分追成浏览器的响应不良影响。 –