let p = function () { return new Promise(function (resolve, reject) { resolve('开始'); }); }; p().then(function (data) { //注意这里打印了一个未定义的变量 console.log(a); }).catch(function (reason) { //这里会捕获到错误 console.log('rejected'); console.log(reason); });
Promise还提供了,all(),race(),reject(),resolve()等在构造函数上的方法,调用这些方法并不需要实例化对象。
all()方法,可以让我们并行的执行异步操作,直到所有操作完成了,才执行回调。
function fn1() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn1'); }, 1000); }); } function fn2() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn2'); }, 2000); }); } function fn3() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn3'); }, 3000); }); } //all会等待所有操作完成,会把所有操作的结果放到一个数组中,传给then。 Promise.all([fn1(), fn2(), fn3()]).then(function (data) { console.log(data); });
race()方法是谁先处理完,就以谁为准,把最先处理完的结果传给then。
function fn1() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn1'); }, 1000); }); } function fn2() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn2'); }, 2000); }); } function fn3() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve('fn3'); }, 3000); }); } //race是以谁先处理完,就以谁为准,fn1最先处理完,那fn1的结果会传给then //注意这里fn2和fn3还是会执行,不过不会进入then了 Promise.race([fn1(), fn2(), fn3()]).then(function (data) { console.log(data); });
reject()方法,返回一个带有拒绝原因reason参数的Promise对象。
// Promise.reject('错误') // 等同于 // new Promise(function(resolve, reject) { // reject('错误'); // }); let p = Promise.reject('错误'); p.then(function (data) { }).catch(function (reason) { console.log(reason); });
resolve()方法,根据传入的值返回一个Promise对象。
//如果传入的参数是普通值,则返回一个新Promise对象,并以该值resolve let p1 = Promise.resolve('OK'); p1.then(function (data) { console.log(data); }); //如果传入的参数是一个Promise对象,则原封不动的返回该Promise对象 let obj = new Promise(function (resolve, reject) { resolve('我是Promise对象'); }); let p2 = Promise.resolve(obj); p2.then(function (data) { console.log(data); console.log(p2 === obj); }); //如果传入的参数是一个thenable对象(带有then方法), //会转换成Promise对象,并执行thenable对象的then方法 let then = { then(resolve, reject) { resolve('我是thenable对象'); } } let p3 = Promise.resolve(then); p3.then(function (data) { console.log(data); }); //如果什么参数都不传入,则返回状态为resolved的Promise对象 let p4 = Promise.resolve(); p4.then(function (data) { console.log(data); }).catch(function (reason) { console.log(reason); });
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》