promise

柯里棱镜
• 阅读 1539

说说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来玩玩.

点赞
收藏
评论区
推荐文章
从 生成器 到 promise+async
本文主要讲解js中关于生成器的相关概念和作用,以及到后面结合promise实现es7中的async原理,你将学习到js中异步流程控制相关知识1、认识生成器思考如下代码:javascriptletx1functionfoo()xbar()console.log(x)//3functionbar(
Chase620 Chase620
4年前
Promise从入门到拿Offer之手写Promise
1、Promise构造函数的实现Promise构造函数用来声明示例对象,需要传入一个执行器函数。其中包括resolve函数和reject函数,以及几个重要的属性:状态属性、结果属性和回调函数队列。构造函数的基本框架resolve函数用于异步处理成功后调用的函数。其中包括验证对象状态修改次数,修改promise实例对象状态,异步调用成功的回调函数
菜园前端 菜园前端
2年前
说说我对Git的工作流程的理解
原文链接:我们既然知道了要利用git工具进行将本地代码提交到线上仓库,以及通过线上仓库同步代码到本地,表面上大家可能认为只有两个步骤,不就是上传和同步嘛?其实里面还细化了一些其他事项。下面将会详细介绍一下Git完整的工作流程。:::tip一样的教学方式,先
Stella981 Stella981
3年前
JavaScript中Promise 使用、原理以及实现过程
1.什么是Promisepromise是目前JS异步编程的主流解决方案,遵循Promises/A方案。2.Promise原理简析(1)promise本身相当于一个状态机,拥有三种状态pendingfulfilledrejected一个promise对象初始化时
Stella981 Stella981
3年前
ES6中自带的promise的问题
ES6中的Promise作用:解决异步嵌套问题。但是只能解决两层嵌套,不能解决两层以上嵌套;解决方法是我自己封装的函数如下:functionPromising(){var_arr;this.thenfunction(fx){
Stella981 Stella981
3年前
ES6 Promise 对象扯谈
newPromise(/executor/function(resolve,reject){...});Promise的构造函数接收一个函数作为参数,函数里面传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来
Stella981 Stella981
3年前
Promise 多重链式调用
Promise对象是用于异步操作的。Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢?使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。以下是个小Demo:/e.g/sen
Stella981 Stella981
3年前
Promise对象 3 种妙用
9012年末,作为一个前端,说不了解Promise对象用法的基本不存在,这里就不对功能用法进行介绍了。但本文将会讲述你可能不知道的Promise3种奇妙用法。当然,每种用法都会有其适用的特殊场景。Promise对象是可以缓存需求对于一个对象而言,能够被缓存并不是一件难以理解的事情。缓存使用的意
Promise规范与原理解析 | 京东物流技术团队
Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。
京东云开发者 京东云开发者
7个月前
Promise规范与原理解析
作者:京东物流孙琦摘要Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。Promise出现的原因首先我们先来看一段代码:异步
Immerse Immerse
3个月前
Promise 这个新 API 真香!
Hey,我是沉浸式趣谈本文首发于【沉浸式趣谈】,我的个人博客https://yaolifeng.com也同步更新。转载请在文章开头注明出处和版权信息。如果本文对您有所帮助,请点赞、评论、转发,支持一下,谢谢!聊到异步,Promise大家肯定都不陌生,是咱们