Promise 对象及相关面试题

Posted QIANDXX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise 对象及相关面试题相关的知识,希望对你有一定的参考价值。

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

Promise 对象的两个特点:
  • 对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:
    pending: 初始状态,不是成功或失败状态。
    fulfilled: 意味着操作成功完成。
    rejected: 意味着操作失败。

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变:
    从 Pending 变为 Resolved
    从 Pending 变为 Rejected

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise 优缺点:

优点:

  • 有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
  • Promise 对象提供统一的接口,使得控制异步操作更加容易。

缺点:

  • 无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
  • 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
  • 当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
基本用法:

要想创建一个 promise 对象、可以使用 new 来调用 Promise 的构造器来进行实例化。
创建 promise 的步骤:

var promise = new Promise(function(resolve, reject) {
    // 异步处理
    // 处理结束后、调用resolve 或 reject
});

Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

实例:

var myFirstPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
    //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是html5的一些API方法.
    setTimeout(function(){
        resolve("成功!"); //代码正常执行!
    }, 250);
});
 
myFirstPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值.
    //successMessage参数不一定非要是字符串类型,这里只是举个例子
    document.write("Yay! " + successMessage);
});

对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。

  • promise.then() 是 promise 最为常用的方法。
promise.then(onFulfilled, onRejected)

promise简化了对error的处理,上面的代码我们也可以这样写:

promise.then(onFulfilled).catch(onRejected)
相关面试题
  • Promise 凭借什么消灭了回调地狱?
  • 为什么Promise要引入微任务?
  • Promise 如何实现链式调用?
  • 实现Promise的 resolve、reject 和 finally
  • 实现Promise的 all 和 race

更多前端面试题【点击此处】免费领取!

以上是关于Promise 对象及相关面试题的主要内容,如果未能解决你的问题,请参考以下文章

promise的原理及面试题

JS手写面试题 --- Promise 以及相关方法的实现

promise 以及相关面试题

说说高频面试题 promise

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象