// 看到一张以前的笔记,再一看还是很容易明白。
//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捕获 不然会报错