关于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>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ... 
随机推荐
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制
			4 任务与任务状态 VxWorks实时内核Wind提供了基本的多任务环境.对用户而言,宏观上看起来,多个任务同时在执行.而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运 ... 
- [Err] 1172 - Result consisted of more than one row
			1 错误描述 [Err] 1172 - Result consisted of more than one row Procedure execution failed 1172 - Result c ... 
- CSS3的[att$=val]选择器
			1.实例源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ... 
- Python内置函数详解——总结篇
			2个多月来,将3.5版本中的68个内置函数,按顺序逐个进行了自认为详细的解析,现在是时候进行个总结了.为了方便记忆,将这些内置函数进行了如下分类: 数学运算(7个) 类型转换(24个) ... 
- Text Document Analysis CodeForces - 723B
			Modern text editors usually show some information regarding the document being edited. For example, ... 
- 下一代 Android
			据闻,Android M 是下一代 Android 的开发代号.那么,对于 M,Google 正在实验着什么? 指纹识别 根据此前的消息,Nexus 6 据称原本是包含指纹识别传感器的,但后来在开发过 ... 
- Python 终端输出字体颜色
			终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表 ... 
- 通过logstash-input-mongodb插件将mongodb数据导入ElasticSearch
			目的很简单,就是将mongodb数据导入es建立相应索引.数据是从特定的网站扒下来,然后进行二次处理,也就是数据去重.清洗,接着再保存到mongodb里,那么如何将数据搞到ElasticSearch中 ... 
- Get the Job You Want(大学英语综合教程4课文)
			UNIT3-1 Harvey Mackay, who runs his own company, often interviews applicants for jobs. Here he lets ... 
- Android JNI开发之C/C++层调用JAVA
			一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ... 
