美文网首页
Promise/Deferred模式

Promise/Deferred模式

作者: fangPeng__ | 来源:发表于2019-06-23 12:20 被阅读0次

    Promise/A

    定义
    • Promise操作只会处于3中状态的一种:未完成状态、完成状态、失败态
    • Promise的状态只会出现在从未完成状态向完成状态或失败态的转化,不能逆反。完成态和失败态不能互相转化
    • Promise的状态一旦转化,将不能逆转。

    在api定义上,Promise/A中一个promise 对象只要具备then()方法即可。对then()方法的简单要去如下:

    • 接受完成态、错误态的回调方法。在操作完成或错误时触发对应的方法。
    • 可选的progress事件回调作为第三个方法
    • then()方法只接受function对象
    • then()方法继续返回Promise对象,以实现链式调用。
      定义如下:
      then(fulfilledHandler, errorHandler, progressHandler)
    演示

    通过继承Node 的events模块来完成演示

    // Promise
    var Promise = function () {
      EventEmitter.call(this)
    }
    utils.inherits(Promise, EventEmitter)
    Promise.prototype.then = function (fulfilledHandler, errorHandler, progressHandler) {
      if (typeof fulfilledHandler === 'function') {
        this.once('success', fulfilledHandler)
      }
      if (typeof errorHandler === 'function') {
        this.once('error', errorHandler)
      }
      if (typeof progressHandler === 'function') {
        this.once('progress', progressHandler)
      }
      return this;
    }
    
    // Deferred
    var Deferred  = function () {
      this.state = 'unfulfilled'
      this.promise = new Promise;
    }
    Deferred.prototype.resolve = function (obj) {
      this.state = 'fulfilled'
      this.promise.emit('success', obj)
    }
    Deferred.prototype.reject = function (obj) {
      this.state = 'failed'
      this.promise.emit('error', obj)
    }
    Deferred.prototype.progress = function (obj) {
      this.promise.emit('progress', obj)
    }
    
    // 对如下的相应对象进行封装
    // 未经Promise封装
    res.on('data', function (chunk){
      console.log(chunk)
    })
    res.on('end', function () {
      // Done
    })
    res.on('error', function () {
      // Error
    })
    // 封装过程
    var promisify = function (res) {
      var deferred = new Deferred()
      var result = ''
      res.on('data', function (chunk) {
        result += chunk
        deferred.progress(chunk)
      })
      res.on('end', function() {
        deferred.resolve(result)
      })
      res.on('error', function (err) {
        deferred.reject(err)
      })
      return deferred.promise
    }
    // 经Promise封装
    promisify(res).then(function () {
      // Done
    }, function () {
      // Error
    }, function (chunk) {
      console.log(chunk)
    })
    

    相关文章

      网友评论

          本文标题:Promise/Deferred模式

          本文链接:https://www.haomeiwen.com/subject/wdliqctx.html