promise深入了解
来源:互联网 发布:免费下载美图秀秀软件 编辑:程序博客网 时间:2024/06/16 22:33
Pormise深入了解
import React from "react";export default class Footer extends React.Component{ constructor(props){ super(props) this.state = { flag : 0, result:'' } } testPromise(){ let promise = new Promise((resolve,reject)=>{ if(this.state.flag == 1){ resolve("操作成功!") }else{ reject("操作失败") } }) promise.then((value)=>{ console.log(value); }) promise.catch((value)=>{ console.log(value); }) } render(){ return ( <div> <p> 测试promise <button style={{margin:"0 10px"}} onClick={this.testPromise.bind(this)}>执行</button> </p> <div>{this.state.result}</div> </div> ) }}
结果:
操作失败Uncaught (in promise) 操作失败
原因分析:
promise支持链式回调,在执行testPromise()时,实际上定义了2个链式,当操作失败时首先执行catch声明的reject事件,但是在我们的方法中还定义了一 个then的链式,它并没有捕获异常,所以执行它的时候会抛出个错误信息。
import React from "react";export default class Footer extends React.Component{ constructor(props){ super(props) this.state = { flag : 0, result:'' } } testPromise(){ let promise = new Promise((resolve,reject)=>{ if(this.state.flag == 1){ resolve("操作成功!") }else{ reject("操作失败") } }) return promise.catch((value)=>{ console.log("失败了:"+value); }) } testPromise1(){ this.testPromise().then((value)=>{ console.log("成功了:"+value); }) } render(){ return ( <div> <p> 测试promise <button style={{margin:"0 10px"}} onClick={this.testPromise1.bind(this)}>执行</button> </p> <div>{this.state.result}</div> </div> ) }}
结果:
失败了:操作失败成功了:undefined
原因分析
执行testPromise()的时候首先就执行了catch方法,此时返回了一个promise对象,但是该对象的异常已经被捕获了,那个该对象就是一个状态为onFulfilled状态的对象,他将执行then定义的方法。
testPromise(){ let promise = new Promise((resolve,reject)=>{ if(this.state.flag == 1){ resolve("操作成功!") }else{ reject("操作失败") } }) promise.catch((value)=>{ console.log("失败了:"+value); }) return promise } testPromise1(){ this.testPromise().then((value)=>{ console.log("成功了:"+value); }) }
结果:
失败了:操作失败Uncaught (in promise) 操作失败
原因分析:
当执行testPromise的时候首先执行了catch方法,但是测试返回的promise对象还是最开始定义的对象,而不是catch捕获异常后生成的新的对象,所以,任然是2个链式,执行then的时候,抛出异常。
testPromise(){ let promise = new Promise((resolve,reject)=>{ if(this.state.flag == 1){ resolve("操作成功!") }else{ reject("操作失败") } }) return promise } testPromise1(){ this.testPromise().then((value)=>{ console.log("成功了:"+value); }).catch((value)=>{ console.log("失败了:"+value); }).then((value)=>{ console.log(value) }) }
结果:
失败了:操作失败undefined
原因分析:
这里只是考察了一个参数传递问题,promise会将放回的参数传递给下一个链式。
testPromise1(){ Promise.resolve("操作成功!").then(Promise.resolve("失败成功!")).then((value)=>{ console.log(value) }) }
结果:
操作成功!
原因分析:
如果then的第一个参数不是一个函数,那么默认将该参数当作null处理。
testPromise1(){ let promise = this.testPromise(); promise.then((value)=>{ console.log(promise) return promise; }).catch((error)=>{ console.log(error) }).then((promise)=>{ console.log(promise) }) }
结果:
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "操作成功!"}操作成功!
原因分析:
返回的promise对像只有PromiseValue被传给了下一个链式。
testPromise1(){ let promise = this.testPromise(); promise.then((value)=>{ console.log(promise) return promise.then((value)=>{ console.log(promise) }); }).catch((error)=>{ console.log(error) }).then((promise)=>{ console.log(promise) }) }
结果:
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "操作成功!"}Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "操作成功!"}undefined
原因分析:
第一个then执行后pormise对象的状态已经为resolved,立即执行return的then方法,但是此时没有返回值,只是一个打印语句,我们说then会返回一个全新的Promise对象,放入之后的链式作业中,所以最后输出undefined。
testPromise(){ let promise = new Promise((resolve,reject)=>{ if(this.state.flag == 1){ resolve("操作成功!") }else if(this.state.flag == 0){ reject("操作失败") } }) return promise } testPromise1(){ let promise = this.testPromise() promise.catch(value=>{ let a = Promise.resolve(promise) console.log(promise) console.log(a) console.log(promise === a) }); }
结果:
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: Promise}falsePromise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
原因分析:
当传入的参数是一个Promise时,对挂起状态和完成状态使用
Promise.resolve()
都会返回原 生的Promise ;对拒绝态的 Promise 使用Promise.reject()
也没问题。而除此之外的情况全都会在原 Promise 上包装出一个新的 Promise 。
- promise深入了解
- 了解Promise
- 了解Promise Angular(转)
- 深入理解promise
- 深入理解 Promise (上)
- 深入理解 Promise (中)
- 深入理解 Promise (下)
- 深入理解Promise
- 深入理解 Promise (上)
- 深入理解 Promise (中)
- 深入理解 Promise (下)
- 深入理解Promise
- Promise深入理解
- 深入 Promise(三)——命名 Promise
- 深入理解JavaScript的Promise
- 深入 Promise(一)——Promise 实现详解
- 深入 Promise(二)——进击的 Promise
- 对Promise.resolve(),Promise.reject(),Promise.prototype.then()的初步了解
- vuejs高仿今日头条移动端
- 使用VBO:顶点缓存
- 如何在Eclipse中第一次启动一个web项目
- Weblogic命令停止部署应用的方法
- 虚拟机配置IP地址
- promise深入了解
- 数据泵导入导出
- 相对空间变换及颜色
- “无法启动程序,因为计算机中丢失MSVCP100D.dll”或者“无法启动程序,因为计算机中丢失MSVCR100D.dll”
- 调用微软网页翻译
- 二、Java集合
- sqlite简单示例
- 常见的监视器介绍及其实现
- 基于vue.js 2.0的百度天气应用