一道笔试题引发的Promise笔记

前言

近来参加校招笔试,发现有好几道关于Promise的题目。然而我都没有了解过。所以,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事。
文章地址:http://lsxj615.com/2016/08/04...

笔试题

console.log(1);new Promise(function (resolve, reject){    reject(true);    window.setTimeout(function (){        resolve(false);    }, 0);}).then(function(){    console.log(2);}, function(){    console.log(3);});console.log(4);

请问输出结果是什么?在揭晓答案之前,我们还是先来了解一下Promise吧。

Promise是什么

Promise 对象用于异步(asynchronous)计算.。一个Promise对象代表着一个还未完成,但预期将来会完成的操作。
Promise 对象是一个返回值的代理,这个返回值在promise对象创建时未必已知。它允许你为异步操作的成功或失败指定处理方法。 这使得异步方法可以像同步方法那样返回值:异步方法会返回一个包含了原返回值的 promise 对象来替代原返回值。

Promise的API

Constructor

使用new来调用Promise的构造器进行实例化

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

Instance Method

对通过new生成的promise对象为了设置其在resolve(成功)/reject(失败)时调用的回调函数可以使用promise.then()实例方法

promise.then(onFulfilled, onRejected);//以防误解,上述的即为以下这种形式promise.then(function(){...}, function(){...});

当resolve(成功)时,会调用onFulfilled函数;
reject(失败)时,会调用onRejected函数。
这也对应了前面笔试题中,onFulfilled其实就是console.log(2),也就是说成功时会调用console.log(2),而失败时,onRejected就是调用console.log(3)。

若只想处理异常情况的函数,可promise.then(undefined, onRejected),当然更好的选择是用promise.catch()来处理。二者效果相同。

promise.then(function (value) {    console.log(value); }).catch(function (error) {    console.log(error);});//等同于以下形式promise.then(function (value) {    console.log(value);}, function (error) {    console.log(error);});

其他方法

  1. Promise.all()

  2. Promise.race()

  3. Promise.resolve()

  4. Promise.reject()

Promise的状态

Promise对象有三种状态

  1. pending 初始状态,既不是fulfilled也不是rejected

  2. fulfilled 成功。此时调用onFulfilled

  3. rejected 失败。此时调用onRejected

Fulfilled和Rejected都可以表示为Settled。
由下图可以了解,最初Promise为pending状态,在执行后转为settled状态,而settled状态分为两种:在成功后转为fulfilled,执行.then(onFulfilled)方法;在失败后转为reject,执行.then(onRejecttion)或.catch(onRejecttion),进行异步操作,再返回Promise对象,转为pending状态。

Promise.resolve & Promise.reject

  1. Promise.resolve

    Promise.resolve(value)可认为是new Promise()方法的快捷方式

Promise.value(value);//等同于以下代码new Promise(function(resolve){    resolve(value);});

此时这个promise对象会进入fulfilled状态。而resolve(value)中的value会传递给后面then中指定的onFulfilled函数。

Promise.resolve(value)返回值也是一个promise对象,所以可以进行链式调用.

  1. Promise.reject

    Promise.reject(error)与上述静态方法类似,也是new Promise()方法的快捷方式

Promise.reject(new Error("出错了"));//等同于以下代码new Promise(function(resolve, reject){    reject(new Error("出错了"));});

这段代码则是调用该promise对象通过then指定的onRejected函数,并将错误对象(Error)传递给onRejected函数。

笔试题解答

话不多说,贴图就是。

可以知道,当promise调用了reject(true)方法,则传递true这个参数给'then'指定的onRejected函数,即题目中的function(){console.log(3);}。但由于'.then'中指定的方法调用是异步执行的,所以会先执行console.log(4);

本篇文章仅是简单介绍promise。欲了解更多内容,可查看以下资料。谢谢~

资料来源:

  1. Promise- Javascipt | MDN

  2. JavaScript Promise迷你书(中文版)

关键字:JavaScript, es6

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部