自定义函数中的回调函数
有没有办法在另一个完成后调用自定义函数。 很多jquery都包含一种回调方式,比如动画完成后你可以把另一个函数作为最后一个参数。 但是无论如何将function1(params, function1(){alert('2');})
或其他东西串在一起? 老实说,我不知道它会是什么样子。
谢谢
您可以使用以下内容创建函数指针:
var yourCallback = function() { alert('2'); }
您可以将其视为包含函数本身的对象(而不是其返回值)。 由于它是一个对象,您可以将其传递给其他函数。
然后将它传递给您作为参数调用的函数(不要使用()
调用它,因为它将传递其返回值):
function1(params, yourCallback);
最后,在function1中,在需要时调用回调:
function function1(args, callback) { //Some code if (callback) { callback(); } }
function doSomething(arg1, callback){ // bla bla bla callback(); }
你的函数结构如下:
function one(x, y, z, callback) { // do operations here callback(); }
然后,由于函数是对象,您可以通过回调参数传递函数,IE:
one(1, 2, 3, function(){alert('hello');});
要么
var func = function() { alert('hello'); }; one(1, 2, 3, func);
要么
function func() { alert('hello'); } one(1, 2, 3, func);
虽然回调很方便,但过度使用会导致丑陋且无法维护的代码。 除了其他答案中显示的标准回调之外,您可能还想查看其他模式,如延迟/承诺和AOP。
在jQuery中,promises是用when()和then()实现的 。
requirejs也是一个很好的起点。
从技术上讲,你要求的模式是:
function myFunctionNeedsACallback(param1, callback) { //do stuff with param1 if(typeof callback === "function"){ callback.call(yourThisParam, anyOtherParams); } }
虽然这是一个有用的模式…过度使用将导致丑陋,不可测试和不可维护的代码。 谨慎使用。
你的例子可以正常工作:
myFunctionNeedsACallback(param, function() { alert('2'); }); //will alert 2 after running the rest of the contents of the function
编辑
解决托马斯的情况:
function ajaxCall1(){ return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/); } function ajaxCall2(){ return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/); } function ajaxCall3(){ return $.ajax(/*your parameters NO SUCCESS CALLBACK NEEDED*/); } $.when(ajaxCall1(), ajaxCall2(), ajaxCall3()).then(function(results1, results2, results3) { //do stuff with all 3 results without "nesting" things });