promise是js中进行异步编程的新的解决方案。从语法层面来说,Promise是一个构造函数;从功能上来说,我们使用promise对象来封装一个异步操作并获取其成功/失败的结果值。简单说promise对象就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
可以把promise对象想象成一个冰块,里面冻着一个梨子(异步任务),随着时间推移,冰块化了(异步任务结束,状态改变了),里面的梨子爆露出来了,之后就一直是这个梨子(promise对象状态不会再变了)
const fs = require("fs");
function read() {
fs.readFile("./a.ts", (err, data) => {
console.log(data);
});
}
read();
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("OK");
}, 3000);
});
// ........
// 可以马上指定,也可以很久之后指定,都是一样的
// ........
// 指定回调1
p.then((value) => {
console.log(value);
});
// 指定回调2
p.then((value) => {
alert(value);
});
PromiseState是Promise对象的实例属性,表示Promise对象的状态。
该属性是原生代码内置的,无法在外部手动直接修改,只有resolve和reject函数可以修改此值。
可由初始状态pending => fulfilled,或由初始状态pending => rejected。
只有这两种状态变化,且只能改变一次。
无论成功还是失败都会有一个返回结果,一般把成功的结果数据称为value,失败的结果数据称为reason。
PromiseResult是Promise对象的实例属性,表示Promise对象的结果值。保存的是异步任务失败/成功的结果,只有resolve和reject函数可以设定此值。
注意:当在excutor函数中throw抛出异常时,promise对象将变为失败状态,结果为该错误对象(即等同于reject)。
同步调用
,可以把异步操作放入此函数内部执行。调用该then的promise对象的成功结果
调用该then的promise对象的失败结果
调用该catch的promise对象的失败结果
答:都会调用
let p =new Promise((resolve,reject)=>{
reject('ok')
})
p.then(res=>{
console.log(res,'111')
},(err)=>{
console.log(err,'333')
})
p.then(res=>{
console.log(res,'222')
},(err)=>{
console.log(err,'444')
})
注意:then()的作用就是指定回调函数,并等待promise对象改变时,执行指定的回调函数。
let p =new Promise((resolve,reject)=>{
resolve('ok')
})
p.then(res=>{
console.log(res)
},(err)=>{
console.log(err)
})
let p =new Promise((resolve,reject)=>{
setTimeout(() => {
resolve('ok')
}, 3000);
})
p.then(res=>{
console.log(res)
},(err)=>{
console.log(err)
})
前提:成功时调用onResolved, 失败时调用onRejeced
为了拿到promise对象的结果,以前需要使用then方法来拿到结果,现在可以使用async await 来直接拿到promise对象的结果。不在需要使用函数调用的方式,直接使用表达式即可。比链式调用更加方便直观
。
then方式:
const fs = require("fs");
function read(url){
return new Promise(function(resolve,reject){
fs.readFile(`./${url}.txt`,function(err,data){
if(err)return;
resolve(data.toString());
});
});
}
read(1).then(function(data){
console.log(data);
read(2).then(function(data){
console.log(data);
read(3).then(function(data){
console.log(data);
read(4).then(function(data){
console.log(data);
read(5).then(function(data){
console.log(data);
read(6).then(function(data){
console.log(data);
});
});
});
});
});
});
// 或者
read(1).then(function(data){
console.log(data);
return read(2)
}).then(function(data){
console.log(data)
return read(3)
}).then(function(data){
console.log(data)
return read(4)
}).then(function(data){
console.log(data)
return read(5)
})
async await方式
async function main(){
var data1 = await read(1);
console.log(data1);
var data2 = await read(2);
console.log(data2);
var data3 = await read(3);
console.log(data3);
var data4 = await read(4);
console.log(data4);
var data5 = await read(5);
console.log(data5);
var data6 = await read(6);
console.log(data6);
}
main();