资讯专栏INFORMATION COLUMN

promise

learn_shifeng / 1317人阅读

说说promise吧, promise 承诺。Promise的理解就是 我对你做出承诺,我怎么怎么,然后我有可能成功,我做到了, 有可能失败, 我没做到, 就是这么个东西.(说的玄一点, 这是一个异步流程控制的一个东东, 至于什么是异步流程控制?我不知道)

new Promise((resolve, reject)=>{})

Promise的状态变化有两种, 从pending —> fulfilled或者 pending—>rejected

pending 是初始的状态, fulfilled 是成功的状态, 剩下的就是失败的状态rejected

Promise会立即执行, 但是状态的改变需要我们来操作。

let abcc = new Promise((resolve, reject)=> {
  console.log("立即执行了")
  setTimeout(()=>{
   resolve("ccc")
  },1000)
  setInterval(()=> {
    console.log(abcc)
  },200)
  console.log("立即执行了2")
})

then

当Promise的状态发生改变,使用then方法来触发对应的处理方法.

两个参数: then方法包含两个参数, 对应当Promise的状态为fulfilled和rejected的回调函数

省略参数: 将创建一个没有其他处理程序的新的Promise,继承Promise最终的状态, then被调用, 第几个参数省略,Promise将采用那个状态

由于then方法返回的是一个新的Promise对象, 所以不会影响到当前的Promise对象,由于返回来的是Promise,所以then后面可以then, then, then….无穷无尽,这样完美的避免了 回调地狱.

let o1 = new Promise((resolve,reject) => {
   resolve(1)
})

o1.then((value)=>{
    console.log("value"+ value)   // 1
    console.log(o1)    // resolved 1
   value +=1;
   return value;
}).then((value)=>{
   console.log(value)      //2
console.log(o1)   //resolved 1 
})

catch

因为我们写的是程序, 所以经常要考虑程序出错的缘故. 就把rejected的函数捕捉给暴露出来了就是所谓的catch, 当状态变为rejected的时候, catch被调用

其实catch就是下面的缩写

Promise.prototype.then(undefined, onRejected)

看下下面这个

var p1 = new Promise(function(resolve, reject) {
  resolve("Success");
});

p1.then(function(value) {
  console.log(value); // "成功!"
  throw "oh, no!"; or   return Promise.reject("oh no ")
}).catch(function(e) {
  console.log(e); // "oh, no!"  
}).then(function(){
  console.log("after a catch the chain is restored");
}, function () {
  console.log("Not fired due to the catch");
});

catch返回的Promise状态, 由于catch是then(undefined, onrejected)的缩写, 第一个参数为空, 所以catch返回的Promise状态为成功

Promise.reject(reson)

返回一个用reason拒绝的Promsie

let o = Promise.reject("sss");
o.catch((reason) => {
  console.log(reason)     // sss
}).then(()=> {
 console.log("resolve")    // 返回这个 理由在上面自己找
}, ()=> {
  console.log("reject")
})

Promise.resolve()

Promise.resolve(value); 正常解析
Promise.resolve(promise);  根据promise的状态来往下传递
Promise.resolve(thenable);  根据then的状态来往下传递

Promise.resolve("Success").then(function(value) {
  console.log(value); // "Success"
}, function(value) {
  // 不会被调用
})

Promise.all()

当所有参数中的promise都完成, 或者任意一个promise的状态变成reject,返回promise

let o1 = new Promise((resolve,reject)=>{
   resolve("1")
})

let o2 = new Promise((resolve,reject)=>{
   resolve("2")
})

let o3 = new Promise((resolve,reject)=>{
   setTimeout(()=> {
     resolve("3")
   }, 3000)
})

Promise.all([o1, o2, o3]).then((value)=>{
  console.log(value)
}).catch((reason)=>{
  console.log(reason)
})

Promise.race()

和all相反, 只要有一个状态改变, 就会返回

可以讲上面的all换成race来玩玩.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84246.html

相关文章

  • Promise的几个扩展API总结

    摘要:的几个扩展总结描述和相反,当所有的被拒绝之后,方法执行完成的决议,如果存在一个执行完成的决议,方法则执行拒绝里边的所有实例反过来就好了执行到此执行到此描述忽略被拒绝的,只需要有一个完成的,方法就执行完成操作,如果全部的都被拒绝,方法执行拒绝 Promise的几个扩展API总结 1. Promise.none 描述: 和 Promise.all 相反,当所有的promise被拒绝之后,n...

    李义 评论0 收藏0
  • Promise 中的三兄弟 .all(), .race(), .allSettled()

    摘要:对于的来说基元函数包括组合函数的类型签名返回情况完成如果传入的可迭代对象为空,会同步地返回一个已完成状态的。相反,如果是在指定的时间之后完成,刚返回结果就是一个拒绝状态的从而触发方法指定的回调函数。在行中,对每个小任务得到的结果进行汇总。 为了保证的可读性,本文采用意译而非直译。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 从ES6 开始,我们大都使用的是 P...

    vspiders 评论0 收藏0
  • 异步发展流程 —— 手写一个符合 Promise/A+ 规范的 Promise

    摘要:构造函数的实现我们在使用的时候其实是使用关键字创建了一个的实例,其实是一个类,即构造函数,下面来实现构造函数。 showImg(https://segmentfault.com/img/remote/1460000018998456); 阅读原文 概述 Promise 是 js 异步编程的一种解决方案,避免了 回调地狱 给编程带来的麻烦,在 ES6 中成为了标准,这篇文章重点不是叙...

    UnixAgain 评论0 收藏0
  • 实现Promise

    摘要:使用是极好的,它是如此有用以至于我觉得应该好好研究一下,甚至是实现一个简易的版本。构造函数检查参数例如是不是函数啊初始化,创建对象执行因此构造函数里面传入的是立即被执行的。 使用Promise是极好的,它是如此有用以至于我觉得应该好好研究一下Promise,甚至是实现一个简易的版本。实现之前,我们先来看看Promise的用途: 使用Promise callback hell Promi...

    xcc3641 评论0 收藏0
  • Promise 对象的理解

    摘要:使用对象的好处在于可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。对象异步操作抛出错误,状态就会变为,就会调用方法指定的回调函数处理这个错误。 Promise 含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。 所谓 P...

    church 评论0 收藏0
  • Promise的源码实现(完美符合Promise/A+规范)

    摘要:以上代码,可以完美通过所有用例。在的函数中,为何需要这个同样是因为规范中明确表示因此我们需要这样的来确保只会执行一次。其他情况,直接返回以该值为成功状态的对象。 Promise是前端面试中的高频问题,我作为面试官的时候,问Promise的概率超过90%,据我所知,大多数公司,都会问一些关于Promise的问题。如果你能根据PromiseA+的规范,写出符合规范的源码,那么我想,对于面试...

    gaomysion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<