2013-10-22 48 views
0

基本上我想指定的函数返回值 - 但返回值的效果基本show()函数,它的主要功能是内设置:返回值

function validateListing(form, hasError) 
{ 
    var status; 

    if (hasError) 
    { 
     scrollToTop(); 
    } 
    else 
    { 
     $('.form').slideUp(function(){ 
      if ($('#user-form').hasClass('complete')) 
      { 
       $('#confirm').show(); 

       status = true; 
      } 
      else 
      { 
       status = false; 
      } 
     }); 

     return status; 
    } 
} 

return status似乎总是给'未定义'。我怎样才能解决这个问题?

+2

效果基本show是asych,可以改为调用该方法在slideUpcallback与状态。 – PSL

回答

0

幻灯片函数的回调是异步的,所以它会在已经返回值之后调用。

元素的类是否在表单滑动时发生变化?否则,你可以只检查幻灯片的回调外类:

function validateListing(form, hasError) { 
    if (hasError) { 
    scrollToTop(); 
    } else { 
    $('.form').slideUp(function(){ 
     if ($('#user-form').hasClass('complete')) { 
     $('#confirm').show(); 
     } 
    }); 
    if ($('#user-form').hasClass('complete')) { 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 
0

这是不够清楚,你是如何使用您的返回值(status),但因为这是一个异步函数,你不能做像这样,相反,你可以做这样的事情(也许还有其他的方式)

function validateListing(form, hasError, func) 
{ 
    var status = false; 
    if (hasError) { 
     scrollToTop(); 
    } 
    else { 
     $('.form').slideUp(function(){ 
      if ($('#user-form').hasClass('complete')) 
      { 
       $('#confirm').show(); 
       status = true; 
      } 
      else { 
       status = false; 
      } 
      // call the callback function with status as argument 
      func(status); 
     }); 
    } 
} 

所以(从函数返回的传统方式),调用带有回调函数的功能,因为它的第三个参数,这样

validateListing('.form', false, function(status){ 
    // write the code here that return value suppose to do 
    alert(status); 
}); 

因此,callback函数将为你正在为你做的工作,你正在试图做的功能returns之后的状态。 Check this fiddle(在文本框中提交表单的值),您将变为true而不是false,并且将通过回调函数公开。

0

要在异步函数使用,你可以使用deferred.promise()

function validateListing(form, hasError) 
{ 
    var dfd = new jQuery.Deferred(); 

    if (hasError) 
    { 
     scrollToTop(); 
    } 
    else 
    { 
     var test = $('form').slideUp(function(){ 
      if ($('#user-form').hasClass('complete')) 
      { 
       $('#confirm').show(); 

       dfd.resolve(true); 
      } 
      else 
      { 
       dfd.resolve(false); 
      } 
     }); 

     return dfd.promise(); 
    } 
} 

$.when(validateListing('testForm')).then(
    function(data) { 
    status = data; 
    console.log(data); 
}); 

看到jsFiddle(不知道你的HTML代码中设置,所以它是一个小的测试ENV)

deferred.promise()方法允许异步函数防止其他代码干扰其内部请求的进度或状态。 Promise只展示附加处理程序或确定状态(然后,完成,失败,总是,管道,进度和状态)所需的Deferred方法,但不包括改变状态的那些方法(resolve,reject,notify,resolveWith,rejectWith ,并通知)。

要了解更多有关延期的承诺对象,请看看here