异步解决方案---promise
栏目: JavaScript · 发布时间: 5年前
内容简介:Promise.all(promise提供了一个 并发的方法 Promise.all 返回的结果是一个promise,只有传递的promise数组全部成功才会返回成功态)
- 回调地狱 如果多个异步请求 有连带关系 回调嵌套
- 多个异步实现并发的话,会出现无法同步异步的返回结果
- 错误处理不方便
什么是promise(承诺)
- promise 有三个状态 (成功态 Resolved 失败态 Rejected 等待态 Pending)
-
默认情况下 状态转换(状态不可逆)
- pending -> resolved
- pending -> rejected
- resolved 不能和rejected相互转换
- 用法:promise在ie下是不兼容的(可以使用webpack的polyfill等方式解决)
// new Promise的时候 需要传递一个executor执行器,执行器函数会默认被内部所执行 new Promise(function(resolve,reject){ // 如果在这里调用了resolve 就会变成成功态 console.log('hello') // 第一个执行 }) console.log('hello1') // 第二个执行 复制代码
let p = new Promise(function(resolve.reject){ resolve(); }) // 每个promise(实例)都有一个then方法 // then方法是一个异步方法,默认不会再当前的上下文中执行(微任务)且比setTimeout先执行 p.then(function(){ console.log('成功') },function(){ console.log('失败') }) 复制代码
// 面试题 setTimeout(function(){ console.log(1) },0) new Promise(function(resolve){ console.log(2) for(var i = 0;i<10;i++){ i==9 && resolve() } console.log(3) }).then(function(){ console.log(4) }) console.log(5) // 2 3 5 4 1 复制代码
promise解决异步的基本使用
-
promise 每次调用then后,分下面几种情况
- 如果返回的是promise 用promise的成功或者失败 执行下一个then
- 如果返回的是一个普通值(包括不写return,默认return undefined)会走外层下一个then的成功
- 如果执行的时候,抛出异常就会走到下一个then中的失败
- then中可以不传递参数,如果不传递 会透到下一个then中
- catch用来捕获错误的,相当于then的第一个参数传递null catch之后仍然可以继续then
let fs = require('fs') function read(file){ return new Promise(function(resolve,reject){ fs.readFile(file,'utf8',function(err,data){ if(err) reject(err) resolve(data) }) }) } // promise的链式调用 read('./name.txt').then(function(data){ // then方法成功后 返回的是一个新的promise 这个返回的promise会被执行,如果返回的promise是成功的,会把这个结果传递到外层的下一个then中 // return read(data) 返回下一个then成功 // throw new Error('出错了') 返回下一个then失败 return data // 返回下一个then成功 },function(err){ console.log(err) }).then(function(data){ console.log('age',data) }).then().catch(function(err){ console.log('error',err) }).then(function(data){ console.log(data) }) 复制代码
// 面试题 new Promise(function(resolve,reject){ resolve(1) }) .then(function(data){ console.log(data) return 2; }) .catch(function(err){ return 3; }) .then(function(res){ console.log(res) }) // 1 2 复制代码
Promise.all(promise提供了一个 并发的方法 Promise.all 返回的结果是一个promise,只有传递的promise数组全部成功才会返回成功态)
Promise.all([read('./name.txt'),read('./age.txt')]).then(function(data){ console.log(data) }).catch(function(err){ console.log(err) }) 复制代码
Promise.race(只要有一个返回成功 就返回成功态)
Promise.race([read('./name.txt'),read('./age.txt')]).then(function(data){ console.log(data) }).catch(function(err){ console.log(err) }) 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 异步解决方案良药Promise
- 解决异步的方案---回调函数
- 前端异步解决方案-4.2(generator+promise)
- Javascript异步执行结果获取的三种解决方案
- 初识react(四) react中异步解决方案之 redux-saga
- 关于JS下大批量异步任务按顺序执行解决方案一点思考
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。