前言

近来参加校招笔试,发现有好几道关于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);
});

其他方法

  • Promise.all()

  • Promise.race()

  • Promise.resolve()

  • Promise.reject()

Promise的状态

Promise对象有三种状态

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

  • fulfilled 成功。此时调用onFulfilled

  • rejected 失败。此时调用onRejected

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

Promise.resolve & Promise.reject

  • 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对象,所以可以进行链式调用.

  • 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。欲了解更多内容,可查看以下资料。谢谢~

资料来源:

  • Promise- Javascipt | MDN

  • JavaScript Promise迷你书(中文版)

一道笔试题引发的Promise笔记相关推荐

  1. 给定一个数值,输出符合中国人习惯的读法--记一道笔试题

    题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如: a.12输出:十二 b.102输出:一百零二 c.1002输出:一千零二 d.112输出:一百十二 e.10112输出:一万零一百 ...

  2. 一道笔试题--求二进制数1的个数

    要进一家新公司难免要进行笔试,虽然笔试通过的人很多都有背题之嫌,但是统计意义上最起码可以看出一个程序员的认真程度,毕竟很多公司的考题也不是自己创的,也是在网上偷的,允许公司偷题就必须允许应聘者偷答案. ...

  3. C#在类型实例化时都干了什么:从一道笔试题说开去

    C#在类型实例化时都干了什么:从一道笔试题说开去 原文来自:http://www.cnblogs.com/instance/archive/2011/05/27/2059409.html 前一阵子我参 ...

  4. java yang模型_一道面试题引发的对Java内存模型的一点疑问

    一道面试题引发的对Java内存模型的一点疑问 问题描述如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会出 ...

  5. 从一道笔试题谈算法优化(下)

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  6. 从一道笔试题谈算法优化(上)

    因为受到经济危机的影响,我在 bokee.com 的博客可能随时出现无法访问的情况:因此将2005年到2006年间在 bokee.com 撰写的博客文章全部迁移到 csdn 博客中来,本文正是其中一篇 ...

  7. 90%的人都不会做的一道笔试题

    关注"Java后端技术全栈" 回复"面试"获取全套大厂面试资料 数组操作的题目,有的确实比较容易,但并非每个问题都是如此.今天就来看道90%的人都不会做的笔试题 ...

  8. 去年,蚂蚁一面的一道笔试题,中等难度

    你好,我是 yes. 最近不是跳槽季嘛,今儿我就来分享一道我之前遇到的笔试题(上机写代码,这里统称笔试),这道题遇到的几率还是比较高的. 很多人可能准备去一波阿里或者其他大厂,而这些大厂面试过程一般都 ...

  9. zz从一道笔试题谈算法优化(上)

    作者:赖勇浩(http://blog.csdn.net/lanphaday) 引子 每年十一月各大IT公司 都不约而同.争后恐后地到各大高校进行全国巡回招聘.与此同时,网上也开始出现大量笔试面试题:网 ...

最新文章

  1. Black Hat|英特尔CPU设计漏洞为恶意软件打开后门
  2. 台湾大学林轩田机器学习基石课程学习笔记8 -- Noise and Error
  3. win2003服务器 虚拟主机安全配置
  4. 【2017年第3期】从点状应用到大数据统一平台
  5. sersync+rsync+inotify-tools集中日志,实时同步
  6. python如何读取文件数据恢复_删python目录
  7. 20061008: IntelliJ Idea 6
  8. Bzoj14981416: [NOI2006]神奇的口袋
  9. 1.窗体与界面设计-菜单应用实例
  10. python下载网页上的pdf文件_利用Python把网页内容转换为pdf格式文件,批量下载到本地!...
  11. oracle delete误删除表数据进行恢复
  12. python批量提取word指定内容_python 批量提取word应聘登记表数据+情感分析
  13. 小米路由修改服务器密码,小米路由器怎么重新设置密码?
  14. 极值理论(一):极大值极限分布
  15. Dual Attention机制
  16. 人工智能 知识表示方法:谓词逻辑和语义网络 题目练习
  17. linux基础命令与文件系统(ip a、ls、cat、vim、cd、pwd、hostname、date、reboot、poweroff、echo、touch、rm、mkdir、diff、file)
  18. win10用户注销后该怎么办?如何彻底删除原有的用户名
  19. Java程序员面试题集(131-135)
  20. 设计原则 - 开闭原则

热门文章

  1. TCP close_wait内幕
  2. mfc编程 孙鑫_孙鑫VC++视频教程笔记-(3)MFC程序框架的剖析 附1-SDI程序流程图
  3. 计算机语言2进制怎么计算,计算机语言二进制…八进制、十进制…怎样推算?数制是怎么读?...
  4. 君君喂大象C语言答案,2017年北师大版二年级语文上册句子专项复习题及答案
  5. 在用c语言写代码是这么找出错误,写代码(C语言)常见粗心小错误
  6. matlab实现频域率滤波,基于Matlab的图像的频域滤波实现及研究.doc
  7. Mysql 给你100万条数据的一张表,你将如何分页查询优化?
  8. java面试总结(一)-----如何准备Java初级和高级的技术面试
  9. [小结]InnoDB体系结构及工作原理
  10. 大厂产品是如何做行业调研和规划的?附汇报模版(PPT)