资料来源:《深入理解es6翻译完整版》
Promise 是为异步操作的结果所准备的占位符。函数可以返回一个 Promise,而不必订阅一个
事件或向函数传递一个回调参数,就像这样:// readFile 承诺会在将来某个时间点完成
let promise = readFile("example.txt");
第十一章 Promise与异步编程
222
在此代码中, readFile() 实际上并未立即开始读取文件,这将会在稍后发生。此函数反而
会返回一个 Promise 对象以表示异步读取操作,因此你可以在将来再操作它。你能对结果进
行操作的确切时刻,完全取决于 Promise 的生命周期是如何进行的。
生命周期
Promise 的生命周期
每个 Promise 都会经历一个短暂的生命周期,初始为挂起态( pending state),这表示异步操作尚未结束。一个挂起的 Promise 也被认为是未决的( unsettled )。上个例子中的Promise 在 readFile() 函数返回它的时候就是处在挂起态。一旦异步操作结束, Promise就会被认为是已决的( settled ),并进入两种可能状态之一:
1. 已完成( fulfilled ): Promise 的异步操作已成功结束;
2. 已拒绝( rejected ): Promise 的异步操作未成功结束,可能是一个错误,或由其他原
因导致。
内部的 [[PromiseState]] 属性会被设置为 "pending" 、 "fulfilled" 或 "rejected" ,以反映 Promise 的状态。该属性并未在 Promise 对象上被暴露出来,因此你无法以编程方式判断 Promise 到底处于哪种状态。不过你可以使用 then() 方法在 Promise 的状态改变时执行一些特定操作。
简单理解下,就是promise会有三种状态,一种是pending状态,就是当我们开始操作的时候,这个时候他只是去执行我们的指令,其次,当任务完成后,比如ajax返回结果后,他再根据我们的操作,返回两个结果,一个是fulfilled,就是我们常用的reslove,其次是rejected,也是我们常用的rejected。
then方法
then() 方法在所有的 Promise 上都存在,并且接受两个参数。第一个参数是 Promise 被完成时要调用的函数,与异步操作关联的任何附加数据都会被传入这个完成函数。第二个参数则是 Promise 被拒绝时要调用的函数,与完成函数相似,拒绝函数会被传入与拒绝相关联的任何附加数据。
可能理解会有点麻烦,就大概是这样,当我们创建一个promise后,当一个状态改变的时候,就会触发then事件,
此时,then内部定义的事件就会被触发,
如:上一篇博客中,当ajax成功的时候,会调用then的方法,其次,会调用catch的方法,
当然,也是可以这样的:
http.post("https://aimianshiguan.com/znzp/open/downYuyin.shtml", a).then((sres) => {
console.log(sres);
},(fres) => { console.log(fres); })
各有爱好,我比较喜欢用catch来处理异常错误,这样子比较好看点
then() 与 catch() 背后的意图是让你组合使用它们来正确处理异步操作的结果。此系统要优于事件与回调函数,因为它让操作是成功还是失败变得完全清晰(事件模式倾向于在出错时不被触发,而在回调函数模式中你必须始终记得检查错误参数)。只需知道若你未给Promise 附加拒绝处理函数,所有的错误就会静默发生。建议始终附加一个拒绝处理函数,即使该处理程序只是用于打印错误日志。
rejected()方法,Thenable:
这两个先压着吧,,,因为我测试的时候感觉兼容有点尴尬,可能是我要求有点高吧,所以就不讲解了