目前只看了一点点,先做下记录
贴下阮一峰关于promise的文章
https://es6.ruanyifeng.com/#docs/promise
这里写的已经很详细了,大家可以直接看阮一峰的
promise的含义
所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
创建容器的方法就是new Promise
注意,在你需要解决异步操作带来的问题的时候,才要去创建这个容器比如有两个函数,f() 和 g(),两个都是异步函数,并且 g() 的参数依赖于f() 执行后得到的参数,这就带来了问题,g() 在执行的时候,f() 可能还没有执行完,g() 无法得到想要的参数
就像这样,g() 函数在1s后执行,但是f() 函数在2s后才能执行完
function f(){
setTimeout(()=>{
global.a = 1
},2000)
}
function g(){
setTimeout(()=>{
console.log(global.a,'a=======')
},1000)
}
f();g()
function f(){
setTimeout(()=>{
global.a = 1
g()
},2000)
}
function g(){
setTimeout(()=>{
console.log(global.a,'a=======')
},1000)
}
f();
其实可以直接在f() 函数执行完后,再执行 g(),我现在的代码就这样干的,但是Promise提供了新的解决异步问题的方案
Promsie里面包含着一个异步操作,它有三个状态 pending(进行中) fulfilled(已成功resolved) rejected(已失败),它只能从pending -> fulfilled(resolved)或者从pending -> rejected ,并且只有异步操作的状态可以改变Promise的状态,同时在Promise状态更改过后就不会再改变
function testFn(){
// 定义一个函数在执行时将promise返回出来
// promise的状态一旦确定了就不能再改变了,所以resolve和reject只能执行一个
return new Promise((resolve,reject) => {
//使用延时来模拟异步操作
setTimeout(()=>{
resolve("成功了")
//在resolve函数执行后,Promise方法的状态就已经固定了,再执行下面的reject函数也不会改变Promise的状态,同理先执行reject函数,resolve函数也不会再改变状态了加粗样式**加粗样式**
},1000)
setTimeout(()=>{
reject("失败了")
},2000)
})
}
testFn()
.then(res=>{
//then方法返回的是一个Promise对象因此可以进行链式调用
// res和err就是resolve方法和reject方法传递过来的参数
// then方法捕获成功状态(then方法也可以捕获reject状态,在他的第二个参数里有err参数,一般都会使用catch方法来捕获reject状态)
// catch方法捕获失败状态
console.log('res=========',res);
},err=> {
console.log('err=======1',err)
})
.catch(err=>{
console.log('err=========',err);
})
console.log('promise=========',testFn());
console.log('promise=========',testFn().then());
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
then 方法和catch方法可以捕获Promise对象的resolved状态和rejected状态,并且then方法和catch方法的参数就是resolve函数和rejected函数传递的参数
三个状态pending resolved rejected 两个改变状态的函数 resolve() reject() 两个捕获状态的方法 then() catch()
其实后面Promise对象还有许多其他方法 (all;finally等方法)后续看了再更
2022/121更新
复习下上面的 Promise是个构造函数,通过new Promise可以创建一个promise实例,promise实例有三个状态pending (等待态)fulfilled(成功态)rejected(失败态);Promsise他有一个回调函数,函数可以传递两个参数resolve()和reject() 这两个也是函数 resolve函数可以将promise实例的状态置为fulfilled(成功态),reject()可以将promise实例的状态置为rejected(失败态),成功态可以通过.then()方法进行捕获,resolve函数传递的参数就是.then()方法回调的参数,同理失败态可以通过.catch()方法进行捕获,rejected函数传递的参数就是.catch()方法回调的参数
看了菜鸟的教程感觉菜鸟写的promise挺容易理解的
https://www.runoob.com/w3cnote/javascript-promise-object.html
var p1 = new Promise(function (resolve, reject) {
// ... some code
reject("失败")
resolve("成功p1");
})
var p2 = new Promise(function (resolve, reject) {
// ... some code
resolve(p1);
})
.then(()=>{
console.log('p1=========',p1);
})
.catch(()=>{
console.log('p1=========',p1);
})
上面这种情况,即p1是一个promise p2也是promise 但是 p2 的 resolve 方法将 p1 作为参数,这时 p1 的状态就会传递给 p2。如果调用的时候,p1 的状态是 pending,那么 p2 的回调函数就会等待 p1 的状态改变;如果 p1 的状态已经是 fulfilled 或者 rejected,那么 p2 的回调函数将会立刻执行。
Promise.prototype.then方法:链式操作
Promise.prototype.then 方法返回的是一个新的 Promise 对象,因此可以采用链式写法。
关于链式调用,.then之后的的.then的参数是通过上一个的.then 里return出来的