Skip to content

创建实例 ​

本节目标:理解“创建实例”的核心思路,并能把它用于实际开发或面试表达。

**创建实例**
使用new操作符后跟构造函数来创建实例。

const promise = new Promise(function (resolve, reject) { // ... some code if (/*


异步操作成功

*/) { resolve(value); } else { reject(error); } });

 **参数:**
构造函数的参数为一个函数;
该函数的两个参数分别是resolve和reject。
它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
  •   resolve函数的作用是
    改变状态:将状态从pending变为resolved;

    传递成功结果:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

  •   reject函数的作用是:
    改变状态:将状态从pending变为rejected;

    传递失败结果:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise 新建后就会立即执行。

let promise = new Promise(function (resolve, reject) {
    console.log('Promise');
    resolve();
});
promise.then(function () {
    console.log('resolved.');
});
console.log('Hi!');
  // Promise
  // Hi!
  // resolved

上面代码中,Promise 新建后立即执行,所以首先输出的是Promise。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。

Promise****实例当参数 resolve函数的参数除了正常的值以外,还可能是另一个 Promise 实例,比如像下面这样。 const p1 = new Promise(function (resolve, reject) { // ... }); const p2 = new Promise(function (resolve, reject) { // ... resolve(p1); }) 注意,这时p1的状态就会传递给p2,也就是说,p1的状态决定了p2的状态。如果p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是resolved或者rejected,那么p2的回调函数将会立刻执行。 const p1 = new Promise(function (resolve, reject) { setTimeout(() => reject(new Error('fail')), 3000) }) const p2 = new Promise(function (resolve, reject) { setTimeout(() => resolve(p1), 1000) }) p2.then(result => console.log(result)) .catch(error => console.log(error)) // Error: fail 上面代码中,p1是一个 Promise,3 秒之后变为rejected。p2的状态在 1 秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对后者(p1)。又过了 2 秒,p1变为rejected,导致触发catch方法指定的回调函数。

注意:调用resolve或reject并不会终结 Promise 的参数函数的执行。

new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(r => { console.log(r); }); // 2 // 1 上面代码中,调用resolve(1)以后,后面的console.log(2)还是会执行,并且会首先打印出来。这是因为立即resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。 一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolve或reject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。 new Promise((resolve, reject) => { return resolve(1); //


后面的语句不会执行
console.log(2);

})

本站总访问 — 次