使函数始终异步

时间:2016-09-23 16:57:19

标签: javascript asynchronous

有人可以帮助我了解这段代码吗?在这种情况下,我不能完全确定将首先执行哪些代码:/显然这确保它将始终打印1到控制台,但我不知道为什么。 “orig_fn.bind.apply ...”这一行对我来说非常困惑:/

function asyncify(fn) {
    var orig_fn = fn,
        intv = setTimeout( function(){
            intv = null;
            if (fn) fn();
        }, 0 )
    ;

    fn = null;

    return function() {
        // firing too quickly, before `intv` timer has fired to
        // indicate async turn has passed?
        if (intv) {
            fn = orig_fn.bind.apply(
                orig_fn,
                // add the wrapper's `this` to the `bind(..)`
                // call parameters, as well as currying any
                // passed in parameters
                [this].concat( [].slice.call( arguments ) )
            );
        }
        // already async
        else {
            // invoke original function
            orig_fn.apply( this, arguments );
        }
    };
}

function result(data) {
    console.log( a );
}

var a = 0;

ajax( "..pre-cached-url..", asyncify( result ) );
a++;

1 个答案:

答案 0 :(得分:1)

让我们了解您的asyncify()函数的功能。

首先,请注意立即调用它,将其结果作为ajax()调用的第二个参数提供。它返回一个匿名函数。

现在,根据调用匿名函数的时间,发生以下两种情况之一:

1)如果它立即被调用,setTimeout还没有触发,因此它获取调用它的参数,并将它们与原始函数{{1}包装在一起调用了,在你的情况下是asyncify()。换行使用result完成。然后退出,让超时处理实际的呼叫。

2)如果没有立即调用它,当它被调用时,超时已经过去,所以它可以立即用新的参数调用原始函数。这是使用bind()完成的。