理解Promise

函数式编程:
一个函数,一定要纯,纯洁。不能对外部有依赖,也不能改变外部的值。否则不可控。函数最好都是单个参数。

从结构化过程式编程到定义过程编程

定义一个纯净的容器

class Container {

    constructor (val) {

        this.val = val;

    }

}

构建一个加1的函数

function addOne(val) {

return val + 1 ;

}

初始化一个容器 然后把值给到+1 函数处理, 得到的结果再初始化一个新的容器对象

完成上述需要下面三步

var obj = new Container(1);

var val = addOne(obj.val);//2

var obj2 = new Container(val);//obj.val = 2

console.log(obj.val,obj2.val);

// 把容器对象obj的内的值进行计算并得到一个新的容器对象,有两件事情可以简化。

// 1. 预先定制好生成新值的函数。注意:具体讲是预先定制好调用生成新值的函数。具体的实现细节由调用者自己决定。

// 2. 封装生产新容器的操作

class Container {

    constructor(val) {

        this.val = val;

    }

    // map 定义一个map 映射函数 把自己的值传递给传进来的函数 其结果作为新容器的参数,返回一个新容器

    map(f) {

        return new Container(f(this.val));

    }

}

创建一个有值的新对象

var obj = new Container('JS');//obj.val = 'JS'

通过map函数创建新函数

var obj2 = obj.map(function (val) {

   return 'hello, '  + val;

});//obj2.val = 'hello, JS'

obj2 也有map函数,可以把自己的值一直传递下去

var obj3 = obj2.map(function (val) {

    return val + ', how are u!';

});//obj3.val = 'hello, JS, how are u!'

那么上面的可以用链条方式来书写

var obj = new Container("JS");

obj.map(function (val) {

   return 'hello, ' + val;

})

.map(function (val) {

  return val + '. how are u!'

})

.map(function (val) {

  console.log(val);

});

假如把map函数换成then。那么链条就是这样的

var obj = new Functor('JS');

obj

  .then(function(val) {

  return 'hello, ' + val;

  })

  .then(function(val) {

 return val + '. how are u!';

  })

  .then(function(val) {

  console.log(val); // hello, JS. how are u!

  })

满足链式写法的一个核心就是:调用的一个then函数或者map函数返回的都是一个对象,该对象也具有then或者map方法。

Promise运用

Promise的链式写法就是这个道理,Promise在某种情况下,就是一种容器。

var promise = new Promise(function(resolve, reject) {

 ....

  });

  

  var promise2 = promise.then(); // 返回一个新的 promise 对象

  var promise3 = promise2.then(); // 返回一个新的 promise 对象

所以可以简写成

 var promise = new Promise(function(resolve, reject) {

  ....

  });

  

  promise.then().then().then().then().then()

Promise的牛逼之处,是定义函数时不用再定义一层层的回调函数,Promise处理的很好。如何没有回调呢?因为Promise对象,定义时,默认要传入一个函数,resolve和reject,没问题就调用resolve,有问题就调用reject。没有回调,如何处理结果。使用另一个机制处理结果和错误,那就是 then 和 catch。

参考链接:

https://code.7xinsheng.com/post/5a2d4068bf5e4b0f9a639b48

https://code.7xinsheng.com/post/5a2d4b8bbf5e4b0f9a639b4b

你可能感兴趣的:(理解Promise)