>  기사  >  웹 프론트엔드  >  간단한 Node.js 비동기 작업 관리자 Sharing_javascript 기술

간단한 Node.js 비동기 작업 관리자 Sharing_javascript 기술

WBOY
WBOY원래의
2016-05-16 16:50:471151검색

최근 nodejs에 대해 글을 많이 썼는데, 처음에는 비동기 작업이 적은 것을 접했습니다. API를 확인해보니 문제를 줄이기 위해 동기 작업이 있다는 것을 알았기 때문입니다. , 방금 동기식을 사용했는데, 점차적으로 이것이 문제가 되지 않는다는 것을 알게 되었습니다. 좋은 비동기식 기능은 필요하지 않지만 동기식 기능을 사용해야 한다는 점은 정말 당황스럽고 많은 것들이 동기식 API가 없습니다.

알겠습니다! 비동기적으로 작성하다 보니 이런 코드가 점차 등장하게 되었습니다. . .

코드 복사 코드는 다음과 같습니다.

mysql.query('xxxx'). on('성공', function(){
mysql.query('xxxx').on('성공', function(){
mysql.query('xxxx').on('성공', function() {
mysql.query('xxxx').on('성공', function(){
mysql.query('xxxx').on('성공', function(){
mysql.query('xxxx').on('성공', function(){
                                                                                   });
});
});
});

글쎄요, 이대로 계속하면 코드가 얼마나 추악해질지 보셨을 겁니다. 노부인의 족보처럼 보일 것이므로 다음과 같은 비동기 작업 관리자가 생성됩니다. 작고 정교합니다. 헤헤, 확실히 충분합니다. 코드에 대해 이야기해 보겠습니다.
과 같이 코드를 강조표시하세요.
TODO: 포괄적이지 않음, 예를 들어 오류가 처리되지 않음


코드 복사 코드는 다음과 같습니다.

/*
* 비동기 관리자
* 작성자 : jser.me
*
* 사용법:
* var asyncMg = require('./AsyncManager') ;
* asyncMg
* .push(function(next){
* some_aysnc_method().on('success'{
* next();
*                                                                           .다음( );
* })
* })
* .push( ... )
* .run() //실행
* .on('success', function() {
* allThings_is_down();
*    });
function typeOf( obj ){
return Object.prototype.toString.call( obj ).match(/[object ([^]]*)]/)[1];
}

함수 AsyncManager( arg ){
this.execArrys = [];
this.push( arg );
}
//시스템에서 제공하는 상속 방법 사용

require('util').inherits( AsyncManager, require('events').EventEmitter );

//성공적으로 실행된 함수 수 표시

AsyncManager.prototype.succCount = 0;



//추가
AsyncManager.prototype.push = function( arg ) {

var This = this;
if( typeOf(arg) == 'Array' ){

arg.forEach( function(v,i){

This.execArrys.push( v );
          });

이것을 반환합니다. //1개 연결

};

//실행

AsyncManager.prototype.run = function(){

var self = this;

If( this.succCount == this.execArrys.length ) {
//모든 함수가 성공적으로 실행된 후 이벤트가 트리거됩니다.
this.emit( ​​​​'success' );
} else {
this.execArrys[ this.succCount ]( self.run.bind( self ) );
}

this.succCount ;
return this; //1개 연결

};


exports = module.exports = function( arg ){
return new AsyncManager( arg );

}





성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.