1.Promise的概念
所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
promise 有三个状态:
1 2 3
| 1.正在进行中 Pending 2.成功 Resolved 当在promise中显示调用resolve()的时候,此时promise的状态被改变,对应promise后的then的第一个function就会执行了 3.失败 Rejected 当在promise中显示调用reject()的时候,此时promise的状态被改变,对应promise后的then的第二个function就会执行了
|
2.Promise的作用
Promise的出现主要是解决地狱回调的问题,比如你需要结果需要请求很多个接口,这些接口的参数需要另外那个的接口返回的数据作为依赖,这样就需要我们一层嵌套一层,但是有了Promise 我们就无需嵌套。
注意:Promise本身不是异步的(Promise中的function会立马执行),只不过Promise中可以有异步任务,当异步任务的执行有结果之后,我们通过resolve和reject来改变promise的状态,当promise的状态改变之后此时promise的then就会执行了
3.使用Promise读取文件举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const fs = require('fs'); console.log("1")
var promise = new Promise(function(resolve,reject){ console.log("2") fs.readFile("./aa.json",function(err,data){ console.log("3"); if(err){ reject("错了,文件不存在"); return; } resolve(data.toString()) }) }) promise.then(function(msg){ console.log("4",msg); },function(msg){ console.log("6",msg); }) console.log("5")
|
4.Promise链
1 2 3 4 5 6
| promise.then(function(){ return new Promise(...) }).then(function(){ return new Promise(..) }).then(function(){ })
|
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| console.log(1) new Promise(function(resolve,reject){ console.log(2) setTimeout(() => { resolve(); }, 2000); }).then(function(){ return new Promise(function(resolve,reject){ console.log(3) setTimeout(() => { resolve() }, 2000); });
}).then(function(msg){ console.log(4,msg) },function(msg){ console.log(6,msg) }) console.log(5)
|
当一个Promise完成(fulfilled)或者失败(rejected),返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回:
• 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
• 如果then中的回调函数没有返回值,那么then返回的Promise将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined。
• 如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
• 如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
• 如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
• 如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。
5.Promise的异常处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const fs = require('fs'); function myread(path){ return new Promise(function(resolve,reject){ fs.readFile(path,function(err,data){ if(err){ reject(err); return; } resolve(data.toString()) }) }) }
myread('./a.json') .then(function(msg){ console.log(msg); return myread('./b.json') }) .then(function(msg){ console.log(msg); return myread('./c.json') }) .then(function(msg){ return myread('./d.json') }) .then(function(msg){ console.log(msg,"aaa") },function(err){ console.log(err,"ddd"); throw new Error(err); }) .catch(function(err){ console.log("处理了异常",err); })
|
5.Promise.all和Promise.race
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var promise1 = new Promise(function(resolve,reject){ setTimeout(function(){ resolve("P1"); },2000); })
var promise2 = new Promise(function(resolve,reject){ setTimeout(function(){ resolve("P2"); },3000); })
Promise.race([promise1,promise2]) .then(function(msg){ console.log(msg); })
|
//Promise.all([p1,p2]) 会等all参数数组中的所有promise都执行完毕之后再执行then
//Promise.all([p1,p2]).then的函数的参数是一个数组参数,会将所有promise执行的结果放到这个数组参数中
//Promise.race([p1,p2]) promise参数数组中的任何一个promise执行完毕之后立马执行then
//Promise.all([p1,p2]).then的函数的参数是最早执行的promise的结果
感谢鼓励