基本上我试图为函数指定一个返回值 - 但返回值是在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
似乎总是给'未定义'。我该如何解决这个问题?
答案 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