在jQuery上排序几个函数

时间:2014-05-01 10:47:40

标签: javascript jquery

我有一个函数可以存储来自HTML表单的多个值,并且必须单独工作才能在我需要的任何情况下存储该信息(即在插入数据库之前,或者在数据库上更新信息之前...)< / p>

我需要能够告诉系统执行此函数('storeValues'),然后执行任何其他函数(可能是'createNewClass''updateExistingClass' ......等等。< / p>

我该如何排序呢?我在这里尝试先存储值,然后在完成时执行另一个函数,但是它表示&#34; storeValues()没有定义&#34;,它被定义:

$('.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函数应该是一个单独的函数,可以从任何其他地方调用,我知道这个问题可以通过执行&#34; createNewClass&#34;来解决。来自&#34; storeValues&#34;功能,但有时我需要执行&#34; updateClass&#34;在&#34; storeValues&#34;之后&#34; createNewClass&#34;

2 个答案:

答案 0 :(得分:1)

您可以使用这样的回调,如果,您的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);
}

如果它是同步的,只需在createNewClass之后调用storeValues即可。

这是做什么的:

  • 使您能够将选择的函数传递给storeValues
  • storeValues内,它调用作为参数传递的回调函数

如果您需要使用其他范围执行功能,可以使用callapply


另一种方法是在没有回调的情况下使用

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()

答案 1 :(得分:0)

这样打电话。它在执行createNewClass函数

之后首先调用storeValues
$('.tableClassHeader').on('click', '.createClass', function(){

    storeValues(function() {
        createNewClass();
    });

});

function storeValues(callback){
    cl_year = $('.newClassForm').find('select[name=cl_year]').val();
    cl_course = $('.newClassForm').find('select[name=cl_course]').val();
    callback();
}