Javascript----Promise初步探究

来源:互联网 发布:淘宝抢红包微信群 编辑:程序博客网 时间:2024/06/06 05:15

最近大概研究了javascript的Promise的用法之后,参照mdn,做出一些很浅显的总结

  1. 构造器
    new Promise(function(resolve, reject) {});
    • Promise的构造器有一个参数,这个参数是一个函数,暂且叫他做函数A。
    • 函数A有两个参数,分别是resolve,和rejected,而这两个参数也都是函数,而javascript对于函数参数并没有像c++一样严格的要求,所以尽管形参有两个,但实参可以有一个或两个甚至0个。
    • resolve和rejected都是只有一个参数的函数,分别对应Promise的成功消息的失败消息
      下面给出一段示例
var p = new Promise(function(resolve/*,rejected//可以根据需要选择*/){    if(doSomethingAsync())        resolve('成功的消息');    /*else rejected('失败的消息');*/}) 
  1. then方法
    定义了Promise对象之后,就可以使用Promise的then方法。
    then方法原型
    Promise.then(onFulfilled,onRejected)
    • then方法有两个参数,并且都是函数,两个函数都是以on开头,是不是类似于onClick之类的属性?对的,这也是一个类似于处理事件的函数,处理的是成功和失败的消息。
    • onFulfilled函数在与resolve的参数是相同的,大概可以看作resolve会把参数传送给onFulfilled的参数,所以resolve的实参就是onFulfilled的参数。onRejected与之类似。
      代码示例
var p = new Promise(    function(resolve,rejected)    {        resolve('message');        console.log('after resolve')    });p.then(    function(v1)    {        console.log(v1+' resolving')    },    function(v2)    {        console.log(v2+' rejected');//onRejected部分,没有被调用    })    //结果:    //after resolve    //message resolving

与then方法类似的还有catch方法

  1. 方法链
    Promise的then和catch函数还支持方法链。因为then在一些时候会返回一个Promise对象
    • 如果在then的参数的两个函数中没有显式的返回Promise对象,而返回了其他值,这个返回值会被再次传递给下一个then方法,相当于重新调用了一次resolve方法传送参数
var p = new Promise(function(resolve,rejected)                     {resolve(1)});p.then(function(val){    return 3    }).then(function(val){    console.log(val);})//结果://3
- 如果then的参数的两个函数显式的返回了新的Promise对象,后面的then或catch对象都会是新的Promise对象
var p = new Promise(function(resolve,rejected)                     {resolve(1)});p.then(function(val){    return new Promise(function(resolve){        resolve(2);    }).then(function(val){    console.log(val);})//结果://2