0

基本上我试图为一个函数指定一个返回值 - 但返回值是在主函数内的 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似乎总是给出“未定义” 。我怎样才能解决这个问题?

4

3 回答 3

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 只公开附加附加处理程序或确定状态(then、done、fail、always、pipe、progress 和 state)所需的 Deferred 方法,但不公开更改状态的方法(resolve、reject、notify、resolveWith、rejectWith , 和 notifyWith)。

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

于 2013-10-22T01:52:39.140 回答
0

slide 函数的回调是异步的,所以它会在返回值后调用。

表单滑动时元素的类会改变吗?否则,您可以只检查幻灯片回调之外的类:

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;
    }
  }
}
于 2013-10-22T01:11:07.420 回答
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状态后尝试执行的工作。检查这个小提琴(在文本框中提交带有值的表单),你会得到 true 而不是 false ,它将通过回调函数公开。

于 2013-10-22T01:35:19.773 回答