本文共 1259 字,大约阅读时间需要 4 分钟。
function foo(){ return new Promise((resolve,reject)=>{ let random = Math.random(); //声明随机数 if(random>0.5){ resolve(random); } else{ reject(random); } });}//调用foo().then((a)=>{ console.log('success:',a);}).catch((b)=>{ console.log('error:',b);});
上面代码中,函数foo返回一个Promise对象,Promise对象的参数为resolve,reject,箭头函数中声明一个随机数,如果大于0.5,则返回resolve,调用then函数,输出success。
cnost p1 = new Promise(function(resolve,reject){ setTimeout(()=> reject(new Error('fail')),3000)})const p2 = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(p1),1000 })})p2.then(()=>{ console.log(result);}).catch(()=>{ console.log(error);});//4s后返回 Error:fail
上面代码中,p1
是一个 Promise,3 秒之后变为reject
。p2
的状态在 1 秒之后改变,resolve
方法返回的是p1
。由于p2
返回的是另一个 Promise,导致p2
自己的状态无效了,由p1
的状态决定p2
的状态。所以,后面的then
语句都变成针对后者(p1
)。又过了 2 秒,p1
变为reject
,导致触发catch
方法指定的回调函数。
new Promise((resolve,reject)=>{ resolve(1); console.log(2);}).then((a)=>{ console.log(a);});//2//1
上面代码中,调用resolve
或reject
并不会终结 Promise 的参数函数的执行。
new Promise((resolve, reject) => { return resolve(1); // 后面的语句不会执行 console.log(2);})
上面代码中,调用resolve
或reject
以后,Promise 的使命就完成了,后继操作应该放到then
方法里面,而不应该直接写在resolve
或reject
的后面。
转载地址:http://jwxgn.baihongyu.com/