Node.jsモジュールのNimboleフロー制御
5666 ワード
もっと読む
NodeJS非同期の特性は、時にプログラムが非常に不細工になり、1つの層に戻してセットしています.この時はフロー制御モジュールで同期か非同期かを制御します.
Nimboleは、軽量で移植可能な関数式フロー制御モジュールです.最小化と圧縮後は837バイトしかなく、Node.jsで実行できます.各種ブラウザでも使えます.それはundersscoreとasyncのいくつかの最も実用的な機能を統合しています.そしてAPIはもっと簡単です.
nimboleには二つのフロー制御関数があります.parallelと_.series名前の通り、私達が使うのは2番目で、一連の関数をシリアルで実行させることができます.series以下のコマンドはNimboleをインストールするためのものです.
上の解方程式の関数をseriesスケジュールで実行するなら、コードはこうなるべきです.
series配列パラメータの関数は順番に実行されます.ただし、私たちのcaculateTailとcaculateHeadはもう一つの関数に包まれています.これは、プロセス制御により実現されるバージョンコードがより多いが、通常は可読性と維持性がより強い.
詳細な例:
シリアル実行(非同期):
並行実行(非同期):
シリアルパラレル(フロー制御):
これはちょっと説明します.まず、ファイルをダウンロードして、ファイルをダウンロードしてから、全部のファイルを包装します.
nimbole.min.js
NodeJS非同期の特性は、時にプログラムが非常に不細工になり、1つの層に戻してセットしています.この時はフロー制御モジュールで同期か非同期かを制御します.
Nimboleは、軽量で移植可能な関数式フロー制御モジュールです.最小化と圧縮後は837バイトしかなく、Node.jsで実行できます.各種ブラウザでも使えます.それはundersscoreとasyncのいくつかの最も実用的な機能を統合しています.そしてAPIはもっと簡単です.
nimboleには二つのフロー制御関数があります.parallelと_.series名前の通り、私達が使うのは2番目で、一連の関数をシリアルで実行させることができます.series以下のコマンドはNimboleをインストールするためのものです.
npm install nimble
上の解方程式の関数をseriesスケジュールで実行するなら、コードはこうなるべきです.
...
var flow = require('nimble');
(function calculate(i) {
if(i === l-1) {
variables[i] = res[i];
process.exit();
}else {
flow.series([
function (callback) {
calculateTail(res[i],res[i+1],function(tail) {
variables[i] = tail;
callback();
});
},
function (callback) {
calculateHead(res[i],res[i+1],function(head) {
res[i+1] = head;
callback();
});
},
function(callback){
calculate(i+1);
}]);
}
})(0);
...
series配列パラメータの関数は順番に実行されます.ただし、私たちのcaculateTailとcaculateHeadはもう一つの関数に包まれています.これは、プロセス制御により実現されるバージョンコードがより多いが、通常は可読性と維持性がより強い.
詳細な例:
シリアル実行(非同期):
var flow = require('nimble');
flow.series([
function (callback)
{
setTimeout(function()
{
console.log('I execute first.');
callback();
newfunc();
}, 1000)
},
function (callback)
{
setTimeout(function()
{
console.log('I execute next.');
callback();
}, 2000)
},
function (callback)
{
setTimeout(function()
{
console.log('I execute last.');
callback();
}, 100)
}
]);
並行実行(非同期):
var flow = require('nimble');
flow.parallel([
function (callback) {
setTimeout(function () {
console.log('one');
callback();
}, 25);
},
function (callback) {
setTimeout(function () {
console.log('two');
callback();
}, 0);
}
]);
シリアルパラレル(フロー制御):
var flow = require('nimble');
var exec = require('child_process').exec;
function downloadNodeVersion(version, destination, callback)
{
var url = 'http://nodejs.org/dist/node-v' + version + '.tar.gz';
var filepath = destination + '/' + version + '.tgz';
exec('curl ' + url + ' > ' + filepath, callback);
}
flow.series
([
function(callback)
{
flow.parallel
([
function(callback)
{
console.log('Downloading Node v0.4.6...');
downloadNodeVersion('0.4.6', '/tmp', callback);
},
function(callback)
{
console.log('Downloading Node v0.4.7...');
downloadNodeVersion('0.4.7', '/tmp', callback);
}
], callback);
},
function(callback)
{
console.log('Creating archive of downloading files...');
exec
(
'tar cvf node_distros.tar /tmp/0.4.6.tgz /tmp/0.4.7.tgz',
function(error, stdout, stderr)
{
console.log('All Done!');
callback();
}
)
}
]);
これはちょっと説明します.まず、ファイルをダウンロードして、ファイルをダウンロードしてから、全部のファイルを包装します.
nimbole.min.js
(function(a){var b=Object.keys||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b};var c=function(a,b){var c=Array.prototype[a];return function(d,e,f){var g=d?d[a]:0;return g&&g===c?g.call(d,e,f):b(d,e,f)}};var d=c("forEach",function(a,c){var d=a instanceof Object;var e=d?b(a):a||[];for(var f=0,g=e.length;f
:http://caolan.github.io/nimble/
:Node.js Nimble