2014-03-29 42 views
1

我试图这样做是为了消除“DOOM的回调金字塔”:JS为了执行功能,同时通过下一个函数作为参数

$$(//my function 
    function(next) { // <- next is the next function 
    setTimeout(next,1000); // simple async function 
    }, 

    function(next){ // this function is the previous's function "next" argument 
    waitForSomethingAndReturnAValue(next, "I am a parameter!"); 
    }, 

    function(aValue){ 
    console.log("My value is:" + aValue); 
    } 
); 

但我一直在摆弄了约一个小时,和我的代码不起作用,有帮助吗?这是我走到这一步:

function $$(){ 
    for (a in arguments){ 
    arguments[a] = function(){ 
     arguments[a](arguments[Math.max(-1, Math.min(a+1, arguments.length-1))]); 
    }; 
    } 
    arguments[0](); 
} 
+0

?你可以用你想要的函数做一个数组,并使一个函数执行数组中的第一个函数,然后删除它 – juvian

+0

是的,但我需要它,所以函数本身执行下一个函数。看到代码块#1 – Wazzaps

+0

可能重复的[JavaScript中的信号量队列?](http://stackoverflow.com/questions/17528749/semaphore-like-queue-in-javascript) –

回答

1

事情是这样工作的:

function $$() { 
    if (arguments.length <= 0) return; 
    var args = Array.prototype.slice.call(arguments); // convert to array 

    arguments[0](function() { $$.apply(null, args.slice(1)); }); 
} 

$$(function(next) { alert("one"); next() }, function (next) { alert("two"); next() }); 

http://jsfiddle.net/Cz92w/

你只是想以执行多种功能
0

你可以试试这个:

function $$(){ 
    var i=0, ret, args = [].slice.call(arguments); 
    var obj = { 
     next: function() { 
      ret = args[i++].call(obj, ret); 
     } 
    }; 
    obj.next(); 
} 

,并使用它像这样:

$$(
    function() { 
     console.log(Date() + ' - Function 1'); 
     setTimeout(this.next, 1e3); // simple async function 
    }, 
    function(){ 
     console.log(Date() + ' - Function 2'); 
     return waitForSomethingAndReturnAValue(this.next, "I am a parameter!"); 
    }, 
    function(aValue){ 
     console.log(Date() + ' - Function 3'); 
     console.log("My value is:" + aValue); 
    } 
); 
function waitForSomethingAndReturnAValue(callback, param) { 
    setTimeout(callback, 2e3); 
    return param + param; 
} 

基本上,每个函数的返回值传递作为下一个论点的论据。而对下一个功能的引用是this.next

相关问题