promise 의 실현 원리

6916 단어 nodejs함수 상해
node EventEmitter 를 핵심 으로 기초 판 promise 구현
//  node EventEmitter  promise
    var Promise = function(){
        EventEmitter.call(this);//        
    }
    util.inherits(Promise,EventEmitter);//  node util    inherits    
    Promise.prototype.then = function(fulfilledHandler, errorHandler, progressHandler){
        if(typeof fulfilledHandler === 'function'){
            this.once('success', fulfilledHandler);//  once     
        }
        if(typeof errorHandler === 'function'){
            this.once('error', errorHandler);
        }
        if(typeof progressHandler === 'function'){
            this.on('progress',progressHandler);
        }
        return this;
    }
    var Deffered = function(){
        this.state = 'unfulfilled';
        this.promise = new Promise();
    }
    Deffered.prototype.resolve = function(obj){
        this.state = 'fulfilled';
        this.promise.emit('success',obj);
    }
    Deffered.prototype.reject = function(obj){
        this.state = 'failed';
        this.promise.emit('error',obj);
    }
    Deffered.prototype.progress = function(obj){
        this.promise.emit('progress',obj);
    }

    //           
    var promisify = function(res){
        var deffered = new Deffered();
        var result = '';
        res.on('data', function(chunk){
            result += chunk;
            deffered.progress(chunk);
        });
        res.on('end', function(){
            deffered.resolve(result);
        });
        res.on('error', function(err){
            deffered.reject(err);
        });
        return deffered.promise;
    }

    //    
    promisifi(res).then(function(){},function(){},function(){});

이 deffered 는 주로 비동기 모델 의 상 태 를 유지 하 는 데 사 용 됩 니 다. promise 는 외부 에 작용 하고 then () 을 통 해 사용자 정의 논 리 를 추가 합 니 다.
다 중 비동기 협력 은 어떻게 실현 해 야 합 니까? /다 중 비동기 협력 문 제 를 해결 하 다.
    Deffered.prototype.all = function(promises){
        var count = promises.length;
        var that = this;
        var results = [];
        promises.forEach(function(promise,i){
            promise.then(function(data){
                count--;
                results[i] = data;
                if(count === 0){
                    that.resolve(results);
                }
            },function(err){
                that.reject(err);
            });
        });
        return this.promise;
    }
    //       
    var deffered = new Deffered();
    deffered.all([promise1,promise2]).then(function(results){},function(err){})

후속 사고: 시퀀스 지원, 즉 체인 호출 을 지원 하려 면 주로 두 가지 절차 가 필요 합 니 다. 1. 모든 리 셋 을 대기 열 에 존재 합 니 다.2. promise 가 완 료 될 때 각각 리 셋 을 실행 합 니 다. 새로운 promise 대상 으로 돌아 가 는 것 이 감지 되면 실행 을 중단 한 다음 현재 deffered 대상 의 promise 인용 을 새로운 promise 대상 으로 개편 하고 대기 열 에 남 은 리 셋 을 새로운 promise 에 전달 합 니 다.구체 적 인 실현 은 90 페이지 를 참고 할 수 있 습 니 다! ~

좋은 웹페이지 즐겨찾기