关于js中promise的面试题。
核心点
promise在生命周期内有三种状态,分别是pending,fulfilled或rejected,状体改变只能是 pending-fulfilled,或者pending-rejected。而且状态一旦改变就不能再次改变。
题1
promise.resolve()
.then(() => {
console.log('a');
return new Error('error');
})
.then((res)=>{
console.log('b');
console.log('then:',res);
})
.catch((err) =>{
console.log('c');
console.log('catch:',err);
})
可能有些同学会认为出现了 new Error()就会想当然的认为会执行后面的catch函数,其实不然。
在then函数中return了一个Error,依然会按照正常的流程走下去,并不会执行后续的catch函数,这个是不同于thorw抛出一个Error的,如果是throw抛出一个Error则会被catch函数捕获。
因次答案是:
a
b
c
then:Error : error
题2
const promise = Promise.resolve()
.then(()=>{
return promise;
});
promise.catch(console.error);
结果是
TypeError:Chaining cycle detected for promise #<Promise>
我们需要知道的是Promise的then或者catch里不能返回promise本身,否则会出现死循环,就是上面报的错误。
题3
Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log);
这个题目主要考察的是在 Promise的then或者catch方法中,接收的是一个函数,函数的参数是resolve或者rejiect函数的返回值,如果传入的值是非函数,那么就会产生值的穿透现象。
何为值穿透现象,简单理解就是传递的值会被直接忽略掉,继续执行链调用后续的方法。
所以 题3的 答案是 1.
第一个then接受值2 ,第二个接收一个Promise,都不是需要的函数,因此这二个then会发生值穿透。
而第三个then因为接收console.log函数,因此会执行,此时接收的是最开始的resolve(1)的值,因此最后返回 1.
题4
Promise.resolve()
.then(function success(res){
throw new Error('error');
},function faill(e){
console.error('fail1:',e);
})
.catch(function fail2(e){
console.error('fail2',e);
})
在Promise的then方法中,可以接收两个函数,一个是用于resolve成功的函数,一个是用于reject失败的函数,两个函数只会调用一个。我们还可以通过.catch方法去实现then方法中的第二个表示失败的函数。
但是有一点不同的是.catch方法可以捕获之前从then方法中抛出的Error,而then方法中的第二个方法捕获不到第一个处理成功的方法中抛出的Error。
因此我们可以得出这道题目的答案,抛出fail2的Error。
上述的题目可以用下面的代码去理解
Promise.resolve()
.then(function success1 (res){
thorw new Error('error');
},function() fail1(e){
console.error('fail1',e);
})
.then(function success2(res){},function fail2(e){
console.error('fail2:',e);
})
关于js中promise的面试题。的更多相关文章
- Angular JS中 Promise用法
一.Promise形象讲解A promise不是angular首创的,作为一种编程模式,它出现在1976年,比js还要古老得多.promise全称是 Futures and promises. 而在j ...
- JS 中Promise 模式
异步模式在web编程中变得越来越重要,对于web主流语言Javscript来说,这种模式实现起来不是很利索,为此,许多Javascript库(比如 jQuery和Dojo)添加了一种称为promise ...
- 读书笔记-你不知道的JS中-promise(3)
坑坑坑 关于术语:决议.完成以及拒绝. 首先观察Promise(..)构造器: var p = new Promise(function(x, y) { //x() 用于完成 //y() 用于拒绝 } ...
- 读书笔记-你不知道的JS中-promise(2)
继续填坑 模式 考虑下面的代码: function fn(x) { //do something return new Promise(function(resolve, reject) { //调用 ...
- 读书笔记-你不知道的JS中-promise
之前的笔记没保存没掉了,好气,重新写! 填坑-- 现在与将来 在单个JS文件中,程序由许多块组成,这些块有的现在执行,有的将来执行,最常见的块单位是函数. 程序中'将来'执行的部分并不一定在'现在'运 ...
- 简单谈谈js中Promise的用法
首先先推荐一篇博文:http://blog.csdn.net/jasonzds/article/details/53717501 这篇博文很清晰的说明了Promise的用法,这里来简单总结一下: Pr ...
- js中promise解决callback回调地狱以及使用async+await异步处理的方法
1.callback回调地狱 function ajax(fn) { setTimeout(()=> { console.log('你好') fn() }, 1000) } ajax(() =& ...
- js中的宏任务与微任务
如果你已经知道了js中存在宏任务和微任务,那么你一定已经了解过promise了.因为在js中promise是微任务的一个入口. 先来看一道题: setTimeout(function(){ conso ...
- 解析js中作用域、闭包——从一道经典的面试题开始
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...
随机推荐
- 【php】DIRECTORY_SEPARATOR的作用
DIRECTORY_SEPARATOR是php的内部常量,用于显示系统分隔符的命令,不需要任何定义与包含即可直接使用. 在windows下路径分隔符是/(当然/在部分系统上也是可以正常运行的),在li ...
- javascript DOM document对象
document对象代表整个html文档 用来访问页面所有元素最复杂的一个dom对象 也是window对象的一个子对象. 对于dom编程中,一个html就会当成一个dom树dom会把所有的html元素 ...
- 错误代码: 1242 Subquery returns more than 1 row
1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT t.id, DATE_FORMAT( t.statisTim ...
- live555编译环境
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
- 芝麻HTTP:如何寻找爬虫入口
寻找爬虫入口 1 .本次任务的入口 这个爬虫的更好的入口就是我们平常使用的搜索引擎.搜索引擎虽然有很多种,但是其实都是在干一件事,收录网页,处理,然后提供搜索服务.在平时使用的过程中,我们通常都是直接 ...
- ASP.NET CORE入门之读取Json配置文件
首先新建一.net core控制台项目,命名为jsonReader 然后选中引用,选择NuGet包管理器,点击浏览引入mircosoft.aspnetcore.all并安装 选中解决方案,填加,新建项 ...
- es6学习笔记--let和const
今天学习了es6中的let和const命令,借此整理一下笔记. let : let 和 var 的声明方式一样,但有 var 比不上的优点.下面用 var 和 let 的例子来加深对 let 的理解. ...
- 【BZOJ4552】排序(线段树,二分答案)
[BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...
- 【Luogu1501】Tree(Link-Cut Tree)
[Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...
- [BZOJ3293] [Cqoi2011] 分金币 (贪心)
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...