创建未决的 Promise
此构造器接受单个参数:一个被称为执行器(executor )的函数,包含初始化 Promise 的代码。该执行器会被传递两个名为 resolve()与 reject() 的函数作为参数。
- resolve() 函数在执行器成功结束时被调用,用于示意该Promise 已经准备好被决议( resolved ),
- 而 reject() 函数则表明执行器的操作已失败。
作业调度( job scheduling )
执行器会在 readFile() 被调用时立即运行。当 resolve() 或 reject() 在执行器内
部被调用时,一个作业被添加到作业队列中,以便决议( resolve )这个 Promise 。
const pro = new Promise((res,rej)=>{
console.log('我是Promise里面的')
setTimeout(()=>{
console.log('我是计时器里面的')
},2000)
})
pro.then(function(val){
console.log(val)
},function(err){
console.log(err)
} )
console.log("我是最外面的")
Promise的生命周期
- pending :挂起,表示未结束的 Promise 状态。相关词汇“挂起态”。
- fulfilled :已完成,表示已成功结束的 Promise 状态,可以理解为“成功完成”。相关
词汇“完成”、“被完成”、“完成态”。 - rejected :已拒绝,表示已结束但失败的 Promise 状态。相关词汇“拒绝”、“被拒
绝”、“拒绝态”。 - resolve :决议,表示将 Promise 推向成功态,可以理解为“决议通过”,在 Promise
概念中与“完成”是近义词。相关词汇“决议态”、“已决议”、“被决议”。 - unsettled :未决,或者称为“未解决”,表示 Promise 尚未被完成或拒绝,与“挂
起”是近义词。 - settled :已决,或者称为“已解决”,表示 Promise 已被完成或拒绝。注意这与“已完
成”或“已决议”不同,“已决”的状态也可能是“拒绝态”(已失败)。 - fulfillment handler :完成处理函数,表示 Promise 为完成态时会被调用的函数。
- rejection handler :拒绝处理函数,表示 Promise 为拒绝态时会被调用的函数。
Promise的状态
【PromiseState】
- pending 未决定
- resolved / fullfilled 成功
- rejected 失败
Promise对象的值
【PromiseResult】
- reject
- resolve
Promise-catch
对错误结果进行处理
Promise-reject
【【PromiseResult】】一定是rejected
-
会抛出错误,可以用catch解决
-
就算reject传入的是Promise对象中的成功函数返回结果都是失败的
响应多个 Promise
Promise.all
- 可迭代对象的元素都是 Promise ,只有在它们都完成后,所返回的 Promise 才会被完成。
- 若传递给 Promise.all() 的任意 Promise 被拒绝了,那么方法所返回的 Promise 就会立刻被
拒绝,而不必等待其他的 Promise 结束:
let p1 = new Promise((resolve, reject) => {
resolve('p1----')
})
let p2 = Promise.reject('p2-----')
let p3 = Promise.resolve('p3-----')
const res = Promise.all([p1, p2, p3])
console.log(res)
Promise.race()
此方法也接受一个包含需监视的 Promise 的可迭代对象,并返回一个新的 Promise ,但一旦来源 Promise 中有一个被解决,所返回的 Promise 就会立刻被解决。
Promise.then()
then()的调用是对上一个Promise对象的resolve()或者reject()函数进行处理,并对其结果进行打印
Promise链中断
利用Promise封装读取文件函数,可以多个文件读取
const fs = require('fs')
// fs.readFile('./fs1.txt',(err,data)=>{
// console.log(data.toString())
// })
function mineReadFile(path){
return new Promise((resolve,reject)=>{
fs.readFile(path,(err,data)=>{
if (err){
reject(err)
}
resolve(data.toString())
})
})
}
mineReadFile('./fs1.txt').
then((val)=>{
console.log(val)
return mineReadFile('./fs2.txt')
}).then((val)=>{
console.log(val)
return mineReadFile('./fs3.txt')
}).then((val)=>{
console.log(val)
})
Promise封装ajax请求
const p = new Promise((resolve, reject) => {
//初始化
const x = new XMLHttpRequest()
//f发送请求
x.open('Get', 'https://api.apiopen.top/getJoke')
//发送请求
x.send()
x.onreadystatechange = function () {
if (x.readyState === 4) {
if (x.status >= 200 && x.status < 300) {
resolve(x.response)
} else {
reject(x.status)
}
}
}
})
参考《深入理解ES6》