SyncRun

A simple tool for you to run async in a queue

#SyncRun syncRun是一个简单的小工具。它通过对异步方法进行简单的封装,来实现异步方法,同步执行的目的。

##例子

var SyncRun = require( 'syncRun' ).newQueue();

var sleep = SyncRun(function(s,fn){

    setTimeout( fn, s );
});

var doSth = SyncRun(function(next){

    console.log( 'do something here!' );
    next();
});

var doElseTh = SyncRun(function(){

    sleep( 3000, function (){

        console.log( 'after 3s, do something else!' );
    });
});

sleep( 5000, function(){

    console.log( '5s passed' );
} );

doSth();

doElseTh();

上面将输出:

5s passed
do something here!
after 3s, do something else!

##使用

  • 创建一个队列:var SyncRun = require( 'syncRun' ).newQueue();
  • 创建用于该队列中的方法:SyncRun(fn) 其中fn为需要封装的方法,SyncRun将返回一个封装好的函数对象
  • 按照同步执行的思路,以此调用这些方法。
  • 支持封装后方法的多重嵌套(比如例子中doEleseTh内部使用了封装过的sleep

##说明(重要!)

###所谓的同步

在syncRun中的同步,在外观上并非如同步代码那样的同步。syncRun的同步是这样的:

  • 所有在同一个队列中的封装好的方法根据调用顺序,依次执行。一个方法完成后,下一个方法才能执行
  • 一个封装过的方法,它所谓的“完成”,包括:方法本身执行完毕,其回调函数执行完毕,所有在其方法执行中或者回调函数执行中被调用的子方法(必须是经过syncRun封装过的方法)执行完毕才被认定为完成
  • 不同队列中的方法互不影响。

###回调

syncRun的实现中,默认将一个函数的所有参数的最后一个参数(如果这个参数是一个函数对象的话)作为回调,若最后一个参数不是函数对象,则会默认添加一个回调函数。

因此,激活你的队列继续执行的动力之一,便是回调函数的被执行。这一点在使用中需要注意。

对于同步方法(本身没有任何封装的意义,但是如果你一定要封装的话…),由于一般我们不需要给定回调,因此最后一个参数多半也不会是函数,因此在实现中,默认会添加一个空的回调。比如上面的例子中:

var doSth = SyncRun(function(next){

    console.log( 'do something here!' );
    next();
});

这个doSth本身是一个同步方法,没有任何异步的操作,我们可以直接通过doSth(),来调用。但是为了在它执行后,队列能继续执行,我们需要在函数中执行next()