一、Promise基础回顾
Promise是JavaScript异步编程的一种解决方案,它是ES6引入的新特性。Promise对象可以看做是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。Promise使得异步编程更加直观、简洁,并且解决了回调地狱问题。
Promise有三种状态:Pending(进行中)、Resolved(已完成)、Rejected(已失败)。其中,Resolved与Rejected称为Promise的终态,一旦Promise进入终态,就不会再改变状态。而Pending状态可以转为Resolved或Rejected状态。
二、什么是resolve()
resolve()是Promise对象状态由Pending转为Resolved时的回调函数,用于异步操作成功后执行的代码。其原型如下:
Promise.resolve(value);
value 表示 Promise对象最终的状态值,可以是任何JavaScript值,包括另一个Promise对象。当value为Promise对象时,resolve()将等到该对象的状态改变,然后才会根据该对象最终的状态(Resolved或Rejected),决定当前Promise对象的最终状态。
resolve()可以认为是一个快速创建一个Resolved状态的Promise对象的方法。
三、resolve()的使用方法
1、将任意值转换为Promise对象
resolve()方法可以将任意值转换为Promise对象。如果参数是Promise对象,则直接返回该对象;否则,返回一个新的Promise对象,状态为Resolved。
// 示例 1 let p = Promise.resolve('value'); console.log(p); // Promise { 'value' } // 示例 2:将值4转换为Promise对象,并在回调函数中输出这个值 Promise.resolve(4).then(function (value) { console.log(value); // 4 }); //示例 3:将Promise对象转换为Promise对象 let origin = new Promise((resolve, reject) => { setTimeout(() => { resolve('value'); }, 1000); }); let p = Promise.resolve(origin); // 将origin转换为Promise对象 console.log(p === origin); // true
2、在流程中延迟Promise的行为
在Promise的执行链中,可以使用resolve()方法来加入延迟Promise的行为,来嵌套异步调用流程。
// 示例 1 function asyncSqrt(number) { return new Promise(function(resolve) { setTimeout(function() { console.log(`Calculate sqrt of ${number}`); if (number >= 0) { resolve(Math.sqrt(number)); } else { reject('Square root of negative number'); } }, 500); }); } Promise.resolve(123) .then(asyncSqrt) .then(result => console.log(result)); // 示例 2 function asyncDivide(num1, num2) { return new Promise(function(resolve) { setTimeout(function() { console.log(`Dividing ${num1} by ${num2}`); if (num2 !== 0) { resolve(num1 / num2); } else { reject('Division by zero'); } }, 500); }); } Promise.resolve(15) .then(val => Promise.resolve(val + 2)) .then(val => Promise.resolve(val * 2)) .then(val => asyncDivide(val, 10)) .then(result => console.log(result));
四、resolve()的应用场景
1、异步任务转Promise对象
在异步任务结束后,我们需要把异步的结果传递给后续的同步任务去处理。通过resolve(value),可以将异步操作的结果转换为Promise对象的异步结果,让该Promise对象进入Resolved状态,便于继续执行后续的Promise链式操作。
function async_task(message) { return new Promise((resolve, reject) => { setTimeout(() => { console.log(message); resolve("task success"); }, 1000); }); } async_task("start task").then((value) => { console.log(value); });
2、Promise链中嵌套异步操作
在Promise链中嵌套异步操作时,我们需要延迟一段时间等待异步操作完成,然后再通过resolve()方法将结果传递到下一步。
function async_task(message) { return new Promise((resolve, reject) => { setTimeout(() => { console.log(message); resolve("task success"); }, 1000); }); } async_task("start task").then((value) => { console.log(value); return new Promise((resolve, reject) => { setTimeout(() => { console.log("async operation"); resolve("async success"); }, 1000); }); }).then((value) => { console.log(value); });
3、使用Promise.all()进行批处理
Promise.all()方法可以将多个Promise对象包装成一个新的Promise对象,等待所有的Promise对象都返回后才进入Resolved状态。而这个时间点是所有的Promise都resolve后,而不是按照添加顺序进行resolve的。
function long_task(message, time) { return new Promise((resolve, reject) => { setTimeout(() => { console.log(message); resolve("task success"); }, time); }); } const tasks = [ long_task('task 1', 1000), long_task('task 2', 500), long_task('task 3', 1500) ]; Promise.all(tasks).then(() => { console.log('All tasks are done!'); })
五、总结
resolve()作为Promise对象的状态改变时的回调函数,是Promise链中非常重要的一环。它可以将任意值转换为Promise对象,用于在异步任务结束后,把异步结果传递给后续任务去处理。同时,使用resolve()也可以将异步操作嵌套在Promise链中,以实现批量处理异步任务的目的。