1.用来进行异步编程的新的解决方案。用于处理异步操作,解决回调地狱的问题。
异步编程的几种形式:回调函数、发布订阅、promise、generator、async/awite
promise是一个对象,通过new实例化,传一个函数作为参数,函数里面传入resolve、reject也是两个函数,用于改变promise的状态。可以传入参数给两个函数。
const p=new Promise((resolve,reject)=>{
const xhr = new XMLHttpRequest()
xhr.open("GET","https://api.apiopen.top/getJoke")
xhr.send()
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
if(xhr.status>=200&&xhr.status<300){
resolve(xhr.response)
}else{
reject(xhr.state)
}
}
}
})
p.then((value)=>{
textarea.value=value
},(err)=>{
alert(err)
})
2.promisify()
Node8 提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法.
只要符合 Node.js 的回调风格,所有函数都可以这样转换。也就是说,满足下面两个条件即可。
1)最后一个参数是函数
2)回调函数的参数为 (err, result),前面是可能的错误,后面是正常的结果
const util=require('util')
const fs=require('fs')
let myreadfile=util.promisify(fs.readFile)
myreadfile('静夜思.txt').then(value=>{
console.log(value.toString())
}).catch(error=>{
console.log("!!!",error)
})
promisify()内部返回一个new出来的promise对象
3.promise的两个主要属性
1)promiseState:共有三种状态 pending、resloved、rejected
2)promiseResult:promise的值,保存异步任务成功或失败的结果
4.promise的基本流程
5.
以上代码先打印111,后打印222
6.
Promise.reslove()是一个定义在Promise上的函数,不属于实例对象,其返回值由其传入的参数决定。若传入非promise对象,则其返回值是成功的promise对象,这个对象的promiseState:fulfilled,对象的promiseResult:传入的参数。若传入promise对象,则其返回值由传入的参数的成功与否决定。
--------------------------------------
Promise.rejected()总是返回一个失败的promise对象, promiseState永远都是rejected,对象的promiseResult为传入的参数(即使传入一个成功的promise对象)。
传入一个成功的promise的返回结果
-------------------------------------------------
-------------------------------------------------
8.一共改变promise对象状态为成功和两种改为失败的方法
9.为一个状态指定多种回调,那个变为这种状态时,多个回调都会执行。
10.
11.
如果没有返回值,则返回undefined,再用.then()去接收,接收的是一个成功的promise,其promiseResult是undefined(因为任何非promise的参数都看作是成功的promise)
12.异常穿透
一旦出现错误,就会进入catch,then()就不会执行了
13.
14.async和aweit
async原理: