slideUp()函数中函数的返回值

时间:2013-10-22 01:01:50

标签: jquery

基本上我试图为函数指定一个返回值 - 但返回值是在main函数中的slideUp()函数中设置的:

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似乎总是给'未定义'。我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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;
    }
  }
}

答案 1 :(得分: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,并且它将通过回调函数公开。

答案 2 :(得分: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代码集,所以它是一个小的测试环境)

deferred.promise()方法允许异步函数阻止其他代码干扰其内部请求的进度或状态。 Promise仅公开附加其他处理程序或确定状态(然后,完成,失败,始​​终,管道,进度和状态)所需的延迟方法,但不会公开更改状态的方法(resolve,reject,notify,resolveWith,rejectWith) ,和notifyWith)。

要了解有关Deferred的Promise对象的更多信息,请查看here