我有一个函数,可以存储 HTML 表单中的多个值,并且该函数必须单独工作,以便在我需要的任何情况下存储该信息(即在数据库上插入之前,或在数据库上更新信息之前...)
我需要能够告诉系统执行此函数('storeValues'
),然后执行任何其他函数(可以是'createNewClass'
,'updateExistingClass'
...无论如何)。
我该如何排序?我在这里尝试首先存储值,完成后执行另一个关于值的函数,但它说“storeValues() 未定义”,并且已定义:
$('.tableClassHeader').on('click', '.createClass', function(){
storeValues().promise().done(function(){
createNewClass();
});
});
function storeValues(){
cl_year = $('.newClassForm').find('select[name=cl_year]').val();
cl_course = $('.newClassForm').find('select[name=cl_course]').val();
}
function createNewClass(){
alert(cl_year);}
我的意思是 storeValues 函数应该是一个单独的函数,可以从任何其他地方调用,我知道这个问题可以通过从“storeValues”函数执行“createNewClass”来解决,但有时我会需要在“storeValues”之后执行“updateClass”,而不是“createNewClass”
最佳答案
您可以使用这样的回调,如果您的storeValues
不像您的示例中那样同步:
$('.tableClassHeader').on('click', '.createClass', function(){
storeValues(createNewClass);
});
function storeValues(callback){
cl_year = $('.newClassForm').find('select[name=cl_year]').val();
cl_course = $('.newClassForm').find('select[name=cl_course]').val();
callback();
}
function createNewClass(){
alert(cl_year);
}
如果是同步的,只需在storeValues
之后调用createNewClass
就足够了。
它的作用是:
- 使您能够将选择的函数传递给
storeValues
- 在
storeValues
内部调用作为参数传递的回调函数
如果您需要在不同的范围内执行函数,您可以使用call
或apply
。
另一种无需回调的方法是使用
http://api.jquery.com/promise/
http://api.jquery.com/jQuery.when/
http://api.jquery.com/deferred.promise/
示例如下 http://jsfiddle.net/47fXF/1/ :
$('.tableClassHeader').on('click', '.createClass', function(){
$.when(storeValues()).then(createNewClass);
});
function storeValues(){
var dfd = new jQuery.Deferred();
setTimeout(function(){
console.log('storing values');
cl_year = $('.newClassForm').find('select[name=cl_year]').val();
cl_course = $('.newClassForm').find('select[name=cl_course]').val();
dfd.resolve();
}, 1000);
return dfd.promise();
}
function createNewClass(){
alert("trololo");
}
添加了setTimeout
来模拟异步。
如果您的 storeValues
仅使用 jQuery 发出一个 ajax 请求,那么您可以直接返回它,如 API 文档中所示。
还要确保适本地调用 resolve()
、reject()
。
关于javascript - 在 jQuery 上对多个函数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406182/