美文网首页
Promise小计

Promise小计

作者: 不再犹豫Debug | 来源:发表于2019-08-14 21:19 被阅读0次

使用promise挺长时间了。但一直是拿过来就用,没有好好研究过。最近闲来无事,稍微研究下。
promise 翻译过来就是许诺、允诺。可以理解为我承诺事后做什么事。

主要用途

  • 用于异步计算
  • 可将异步操作队列化,按照期望的顺序进行,返回预期的结果
  • 可以在对象之间传递和操作Promise

异步计算

console.log('start')
new Promise(resolve => {
    setTimeout(() => {
        resolve('hello')
    }, 2000)
})
    .then(value => {
        console.log(value + ' world')
    })

上面就是一个简单的异步计算实例
先输出‘start’,两秒后输出‘hello world’

console.log('start')
new Promise(resolve => {
    setTimeout(() => {
       //  resolve('hello')
    }, 2000)
})
    .then(value => {
        console.log(value + ' world')
    })

类似上实例,如果注释掉resolve()方法,结果如何?
先输出‘start’,然后两秒后。。。。。 咦?没东西了?
这时候引出promise的状态,它共有
1.Pending:进行中
2.Resolved(Fulfilled):已完成
3.Rejected:已失败
三种状态
new的时候会立刻进入Pending状态,然后当执行到resolve或者reject的时候会改变状态,同时会生成对应的方法,直到遇到.then()或者.catch()后执行。
这就意味着,你也可以

console.log('start')
let p = new Promise(resolve => {
    setTimeout(() => {
       //  resolve('hello')
    }, 2000)
})
p.then(val => {
     console.log(value + ' world')
})

跟第一个代码块执行的效果一样。
这里有必要说一下,promise理论上可以执行任何异步操作。包括confirm弹框事点击确定取消的事件。new Promise 弹框,点击确定 执行.then(),点击取消 执行.catch()

队列化

所谓队列化,就是链式调用。
类似与jq的链式调用。promise实现链式调用就是通过.then()里return一个新的promise来实现的。

console.log('start');
new Promise((a) => {
  setTimeout(() => {
    a('hello')
  }, 1000)
})
  .then(val => {
    console.log(val + ' world');
    return new Promise(a => {
      setTimeout(() => {
        a('hello again')
      }, 1000)
    })
  })
  .then(val => {
    console.log(val);
  })

可传递

可传递的属性,在第三个代码块已经写了。哈哈,一不小心就写早了!

更多

此外,promise还有.all()的方法。这个方法就是的作用是将多个promise包装成一个。

Promise.all([p1, p2, p3, ...]).then(arr => {}).catch(error => {})

.all()方法接受一个数组对象最为参数,数组里可以是promise,也可以是其他值,只有是promise才会等待状态改变。当所有子Promise都完成时,这个Promise才完成,返回值是数组。
如果子Promise有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。
与.all()方法对应的还有.race()方法。
all是等所有的异步操作都执行完了再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。

相关文章

  • Promise小计

    使用promise挺长时间了。但一直是拿过来就用,没有好好研究过。最近闲来无事,稍微研究下。promise 翻译过...

  • Promise 小计

    Promise Promise.prototype.catch() 如果Promise状态已经变成Resolved...

  • JS继承与Promise小计

    //ES6实现继承 classPerson { constructor(name, age) { this.nam...

  • 2019-07-31

    统计不是“小计”的个数。如果是小计就回“空”,不是小计就按顺序排列。image.png 如果是小计就回“空”,不是...

  • Promise原理及实现

    Promise标准 Promise 规范有很多,如Promise/A,Promise/B,Promise/D 以及...

  • promise相关

    promise promise.race promise.finally promise.catch

  • 2021-12-27Promise自身方法

    Promise.all()Promise.allSettled()Promise.any()Promise.rac...

  • Promise,async,await笔记

    Promise,async,await笔记 Promise 创建promise对象 Promise对象构造方法传入...

  • promise 和 deferred

    一 .promise ******** Promise.all([promise1,promise2,promis...

  • 手写Promise(简单)

    Promise Promise.all Promise.race

网友评论

      本文标题:Promise小计

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