如何理解promise 续一
某些关于promise的问题
能否执行多个回调?
当promise改变为对应状态时都会调用
let p = new Promise((resolve , reject) =>{resolve('success')})p.then(v=>{console.log(v)})p.then(v=>{alert(v)})
promise.then()返回的新promise的结果状态由什么决定
由then()指定的回调函数执行的结果决定
- 如果抛出异常,新promise变为rejected,reason为抛出的异常
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {throw '错误'}, err => {console.log(err)})console.log(result)
- 如果返回的是非promise的任意值,新promise变为resolved,value为返回的值
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return 123}, err => {console.log(err)})console.log(result)
- 如果返回的是另一个新promise,此promise的结果就会成为新promise的结果
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}, err => {console.log(err)})console.log(result)
promise如何串连多个操作任务
- promise的then()返回一个新的promise,可以写成then()的链式调用
- 通过then的链式调用串连多个同步/异步任务
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)})
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)}).then(value=>{console.log(value)})
第二个undefined 产生的原因:
是因为then的返回结果是promise ,promise的返回状态由这个promise的返回值决定的;但是代码中的第一个then的返回值没有写,则第二个的结果就是undefined
promise 异常传透
- 当使用promise的then链式调用时,可以在最后指定失败的回调
- 前面任何操作出了异常,都会传到最后失败的回调中处理
let p = new Promise((resolve, reject) => {reject('fail')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{throw 'fail1'}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})
中断promise 链
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {console.log(11)return new Promise(()=>{})}).then(value=>{throw 'fail1'}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})
尝试自定义promise搭建
在html 页面中,先将promise的使用结构搭建出来
<script type="text/javascript">let p =new Promise((resolve,reject)=>{resolve('success')})p.then(data=>{console.log(data)},err=>{console.warn(err)})</script>
新建一个promise.js文件,在html中引入这个promise
<script src="../js/promise.js" type="text/javascript" charset="utf-8"></script>
//覆盖Promise
function Promise(exectuor){// resolve 函数——表示成功执行的函数function resolve(data){}//reject 函数——表示失败执行的函数function reject(data){}//同步调用exectuorexectuor(resolve,reject);
}
//添加then 方法
Promise.prototype.then= function(onResolved,onRejected){}