tapable学習ノートのAync Serieshook
5602 ワード
Aync SeriesHookの非同期シリアル
tapable生産の脚本からAync Serieshookを見にきました.
まずtapArync+call Ayncを見にきます.
tap加calAsyncを見てください.
また見に来ました.tapPromise+promise
tapable生産の脚本からAync Serieshookを見にきました.
まずtapArync+call Ayncを見にきます.
const {
AsyncSeriesHook
} = require("tapable");
let queue2 = new AsyncSeriesHook(['name']);
console.time('cost2');
queue2.tapAsync('1', function (name, cb) {
setTimeout(() => {
console.log(name, 1);
cb();
}, 1000);
});
queue2.tapAsync('2', function (name, cb) {
setTimeout(() => {
console.log(name, 2);
cb();
}, 2000);
});
queue2.tapAsync('3', function (name, cb) {
setTimeout(() => {
console.log(name, 3);
cb();
}, 3000);
});
queue2.callAsync('webpack', (err) => {
console.log(err);
console.log('over');
console.timeEnd('cost2');
});
//
/*
webpack 1
webpack 2
webpack 3
undefined
over
cost2: 6019.621ms
*/
ソース:"use strict";
var _context;
var _x = this._x;
function _next1() {
var _fn2 = _x[2];
_fn2(name, _err2 => {
if (_err2) {
_callback(_err2);
} else {
_callback();
}
});
}
function _next0() {
var _fn1 = _x[1];
_fn1(name, _err1 => {
if (_err1) {
_callback(_err1);
} else {
_next1();
}
});
}
var _fn0 = _x[0];
_fn0(name, _err0 => {
if (_err0) {
_callback(_err0);
} else {
_next0();
}
});
以上から見て、特に簡単にシリアルで実行します.tap加calAsyncを見てください.
const {
AsyncSeriesHook
} = require("tapable");
// tap
let queue1 = new AsyncSeriesHook(['name']);
console.time('cost1');
queue1.tap('1', function (name) {
console.log(1);
return "Wrong";
});
queue1.tap('2', function (name) {
console.log(2);
});
queue1.tap('3', function (name) {
console.log(3);
});
queue1.callAsync('zfpx', err => {
console.log(err);
console.timeEnd('cost1');
});
//
/*
1
2
3
undefined
cost1: 3.933ms
*/
ソース:"use strict";
var _context;
var _x = this._x;
var _fn0 = _x[0];
var _hasError0 = false;
try {
_fn0(name);
} catch (_err) {
_hasError0 = true;
_callback(_err);
}
if (!_hasError0) {
var _fn1 = _x[1];
var _hasError1 = false;
try {
_fn1(name);
} catch (_err) {
_hasError1 = true;
_callback(_err);
}
if (!_hasError1) {
var _fn2 = _x[2];
var _hasError2 = false;
try {
_fn2(name);
} catch (_err) {
_hasError2 = true;
_callback(_err);
}
if (!_hasError2) {
_callback();
}
}
}
つまり順番を実行して、エラーを報告したら前もって総calbackを実行します.また見に来ました.tapPromise+promise
const {
AsyncSeriesHook
} = require("tapable");
let queue3 = new AsyncSeriesHook(['name']);
console.time('cost3');
queue3.tapPromise('1',function(name){
return new Promise(function(resolve){
setTimeout(function(){
console.log(name, 1);
resolve();
},1000)
});
});
queue3.tapPromise('2',function(name,callback){
return new Promise(function(resolve){
setTimeout(function(){
console.log(name, 2);
resolve();
},2000)
});
});
queue3.tapPromise('3',function(name,callback){
return new Promise(function(resolve){
setTimeout(function(){
console.log(name, 3);
resolve();
},3000)
});
});
queue3.promise('webapck').then(err=>{
console.log(err);
console.timeEnd('cost3');
});
//
/*
webapck 1
webapck 2
webapck 3
undefined
cost3: 6021.817ms
*/
ソース:"use strict";
return new Promise((_resolve, _reject) => {
var _sync = true;
function _error(_err) {
if (_sync)
_resolve(Promise.resolve().then(() => {
throw _err;
}));
else
_reject(_err);
};
var _context;
var _x = this._x;
function _next1() {
var _fn2 = _x[2];
var _hasResult2 = false;
var _promise2 = _fn2(name);
if (!_promise2 || !_promise2.then)
throw new Error('Tap function (tapPromise) did not return promise (returned ' + _promise2 + ')');
_promise2.then(_result2 => {
_hasResult2 = true;
_resolve();
}, _err2 => {
if (_hasResult2) throw _err2;
_error(_err2);
});
}
function _next0() {
var _fn1 = _x[1];
var _hasResult1 = false;
var _promise1 = _fn1(name);
if (!_promise1 || !_promise1.then)
throw new Error('Tap function (tapPromise) did not return promise (returned ' + _promise1 + ')');
_promise1.then(_result1 => {
_hasResult1 = true;
_next1();
}, _err1 => {
if (_hasResult1) throw _err1;
_error(_err1);
});
}
var _fn0 = _x[0];
var _hasResult0 = false;
var _promise0 = _fn0(name);
if (!_promise0 || !_promise0.then)
throw new Error('Tap function (tapPromise) did not return promise (returned ' + _promise0 + ')');
_promise0.then(_result0 => {
_hasResult0 = true;
_next0();
}, _err0 => {
if (_hasResult0) throw _err0;
_error(_err0);
});
_sync = false;
});
帰るのはプロミスです.