js里的promise
// 看到一张以前的笔记,再一看还是很容易明白。 //https://github.com/getify/You-Dont-Know-JS/blob/1ed-zh-CN/async%20%26%20performance/ch3.md let p5= new Promise((resolve,reject)=>{ // 最终需要调用`resolve(..)`或`reject(..)` // 它们是这个promise的解析回调 if (1==0){ resolve( "a1" ); }else{ reject( "a2" ); } }) //这里P5实际是失败的,但是这里只写了成功后要做的事,可以用catch补救 p5.then( function (arg){console.log( '标记1:执行成功,返回' +arg)} ). catch ((er)=>{console.log( '标记2:' +er);}) //应该成功失败都写一下,当然也不是绝对,主要看业务逻辑 p5.then( function (arg){console.log( '执行成功,返回' +arg)} , /*普通函数*/ (er)=>{console.log( '执行失败,返回' +er)} , /*箭头函数*/ ) //返回的then里可以再返回promise p5.then( function (arg){console.log( '执行成功,返回' +arg)}, function (arg){console.log( '执行失败,返回' +arg);return new Promise((success,fail)=>{fail( 'bb' )})} ).then( function (a){console.log( '执行成功2,返回' +a); return new Promise((success,fail)=>{success( '成功cc' )})}, function (a){console.log( '执行失败2,返回' +a); return new Promise((success,fail)=>{success( '失败cc' )})} ).then((a)=>{console.log(`最后一次了,返回${a}`)}) //------------------Promise.all说明-------------------------------------------- function add(xPromise,yPromise) { // `Promise.all([ .. ])`接收一个Promise的数组, // 并返回一个等待它们全部完成的新Promise return Promise.all( [xPromise, yPromise] ) // 当这个Promise被解析后,我们拿起收到的`X`和`Y`的值,并把它们相加 .then( function (values){ // `values`是一个从先前被解析的Promise那里收到的消息数组 return values[0] + values[1]; } ); } //延迟返回必须这样写 var fetchX = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(2) }, 5000) }) } var fetchY=(x,y)=>{ return x+y;} //直接返回可以这样写 add(fetchX(),fetchY(20,30)).then((value)=>{console.log(value)}) //5秒后打印52 //------------------Promise.race说明-------------------------------------------- function add(xPromise,yPromise) { // `Promise.race([ .. ])`接收一个Promise的数组, // 并返回一个最先完成的新Promise 不管结果本身是成功状态还是失败状态。 return Promise.race( [xPromise, yPromise] ) // 当这个Promise被解析后 .then( function (value){ return value; } ); } fetchX=() => { return new Promise((resolve, reject) => { setTimeout(() => { console.log( "经过了5秒" ) resolve( "X" ) }, 5000) }) } fetchY=() => { return new Promise((resolve, reject) => { setTimeout(() => { console.log( "经过了2秒" ) resolve( "Y" ) }, 2000) }) } add(fetchX(),fetchY()).then((value)=>{console.log(value)}). //2秒后打印"经过了2秒"Y, 再过3秒后打印"经过了5秒" 注意: 没有返回 X catch ((error)=>console.log(error)) //如果先返回的是reject 就需要catch捕获 不然会报错