奇葩!面试说真话居然也能拿offer?
今年的快结束了,小张海投了一波简历,几经面试无果,终于又收到了一家面试通知,急急忙忙赶到了面试地点…
—–面试现场—–
程序员小张:你好,我是来面试的
面试官:你好,这是你面试的第一家公司吗?
程序员小张:当然不是啦,面了30多家,都不要我。
面试官:哦哦哦,没事,我们面试了50多个,1个都不愿意来呢。
你简历上写的5年前台开发经验…
程序员小张:大学编程设计也算进去了,全靠同学我划水!实际上工作不到3年…
面试官:曾参加主导十万级以上客户的中大型项目研发…
程序员小张:之前公司负责一个政府外包项目,我提了一丁点儿意见…
面试官:精通javascript/Node,?熟练掌握原生js,css3,es6,响应式布局等,?熟习常用
设计模式,┅┅混合app,小程序等开发部署,熟习webpack,cdn打包性能优化
程序员小张:都是吹的,知道一点儿,就是会写写点页面,会点Ajax请求!
面试官:那就好!吓我一跳,这些你要是都精通,我们一定要不起!
我们公司最近打算做个电商app项目,相似淘宝那种,那你就讲讲具体的实现方式吧。
程序员小张:先搭建开发环境,再到模块的设计和开发,组件封装,访问权限管理,数据请求交互优化,前台性能调优,,es6/7主流知识点的运用,再到打包部署,这些我尽管没用过,但是都听过!工作中一边百度,一边Google,大都可以处理的!
面试官:外瑞外瑞good啊!!!那谈谈薪资,你期望薪资是多少?
程序员小张:我期望薪资写的25K,但7K也可以干,就是会偷懒。钱多点,干活
就勤快点!
面试官:Hmmm,我们写的是15~30K,实际上最多只给到10K,既然你水平有
限,那我就大方点给到8K!但是要经常加班哦!
程序员小张:可以的!反正加班我也是摸鱼!
面试官:行吧,那明天来上班吧!
最近面试碰到能否了解promise和Async,具体怎样用?运用场景?一起学习下:
一、Promise
凡事有因必有果,新事物的出现就代表着老的事物不能满足我们的需求了。Promise 这个新事物就是在这个背景下出现的,而它代替的老事物就是ES6 之前经常被用的 callback(回调函数)。
1)、回调地狱
什么是回调地狱?

一般来说回调地狱就是出现在异步操作中,下一次的操作依赖上一次的结果,一环套一环,套着套着就套的我们头痛难忍,写出了上面的代码。大家在入门学习前台的过程当中有遇见任何关于学习,行业方面的问题,都可以申请加入我的前台学习扣扣裙。缺乏相关的基础教程也可以直接来找我要,我这里整理了一套最新的前台基础教程,学习前台的这个过程当中我也收集了很多前台学习手册,面试题,开发工具,PDF文档书籍教程,可以直接分享给你们。282549184
虽说上面的这种情况不会真实的出现在项目中,但实际开发中为了拿到数据调用多个接口的情况是很常见的,比方要获取图片的路径,需要先发送第一个请求,拿到图片的ID,然通过图片的ID拿到图片的URL,这样第二个请求需要在第一个请求完成后执行;

2)、Promise 处理异步避免回调地狱
Promise 的出现处理了这个问题,先来看看 Promise 怎样处理回调地狱的。

3)、Promise 基础
Promise 对象用于表示一个异步操作的最终完成 (或者失败),及其结果值。Promise 对象是一个代理商对象(代理商一个值),被代理商的值在 Promise 对象创立时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的解决方法(handlers)。这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的 promise 对象。
4)、Promise 状态
一个 Promise 对象值是未知的,状态是可变的,但是无论怎样变化,它的状态永远处于以下三种之间:
· pending:初始状态,既不是成功,也不是失败。
· fulfilled:意味着操作成功完成。
· rejected:意味着操作失败。
Promise 的状态会发生变化,成功时会从pending -> fulfilled,失败时会从pending -> rejected,但是此过程是不可逆的,也就是不能从另外两个状态变成pending。fulfilled/rejected这两个状态也被称为 settled 状态。
5)、Promise使用
JS 万物皆对象,所以 Promise 也可以被我们new出来。我们通过下面的语法来新建一个 Promise 对象:
new Promise( function(resolve, reject) {…} /* executor */ ?);
Promise 的构造函数有一个参数 —— 是一个带有两个参数(resolve, reject)的函数,这两个参数分别代表此次异步操作的结果也就是Promise的状态。resolve和reject函数被调用时,分别会将此次 Promise 的状态改成fulfilled或者者rejected,一旦异步操作结束,Promise 的最终状态只能是二者之一,假如异步成功,该状态会被resolve函数修改为fullfilled;相反当异步过程中抛出一个错误,那么该状态就会被reject函数改成rejected。
6)、Promise API
Promise 的原型链以及对象本身有少量方法供我们使用,其中最常用也比较有可说性的就是下面这几个:
then —— Promise.prototype.then(onFulfilled, onRejected)
增加处理(fulfillment)和拒绝(rejection)回调到当前 promise, 返回一个新的 promise, 将以回调的返回值来 resolve。

可以看到,.then里面拿到的是我们 Promise resolve 过后的数据。并且他还会返回一个 Promise 继续供我们调用,比方:?

then()用法比较简单,大家一定也经常用,这里其实就知道.then()是可以一直链式调用的,由于它的返回值也是一个 Promise,即可以了。
catch — Promise.prototype.catch(onRejected)
增加一个拒绝(rejection) 回调到当前 promise, 返回一个新的 promise。当这个回调函数被调用,新 promise 将以它的返回值来 resolve,否则假如当前 promise 进入 fulfilled 状态,则以当前 promise 的完成结果作为新 promise 的完成结果。?

all —— Promise.all(iterable)
这个方法返回一个新的 promise 对象,该 promise 对象在 iterable 参数对象里所有的 promise 对象都成功的时候才会触发成功,一旦有任何一个 iterable 里面的 promise 对象失败则立即触发该 promise 对象的失败。这个新的 promise 对象在触发成功状态以后,会把一个包含 iterable 里所有 promise 返回值的数组作为成功回调的返回值,顺序跟 iterable 的顺序保持一致;假如这个新的 promise 对象触发了失败状态,它会把 iterable 里第一个触发失败的 promise 对象的错误信息作为它的失败错误信息。Promise.all 方法常被用于解决多 个promise 对象的状态集合。
这个算是我经常使用的一个 API 了,上面的内容尽管有点长,但是总结起来其实也很简单,大概就是如下三个方面:
第一:接收一个 Promise 对象数组作为参数?

第二:参数所有回调成功才是成功,返回值数组与参数顺序一致?

第三:参数数组其中一个失败,则触发失败状态,第一个触发失败的 Promise 错误信息作为 Promise.all 的错误信息。?

Promise.all 用来解决多个并发请求,也是为了页面数据构造的方便,将一个页面所用到的在不同接口的数据一起请求过来,不过,假如其中一个接口失败了,多个请求也就失败了,页面可能啥也出不来;
常见问题
setTimeout 和 Promise 都是异步操作,那么谁更快呢??


总结:promise 无关顺序更快执行
二、Async/Await
还得再来一遍,新事物的出现就代表着老的事物不能满足我们的需求,ES6 刚出 Promise 来处理异步问题,ES7 就又出了一个 Async/Await(其实官方名字是 async function),看来 Promise 并没有达到大家伙的预期,所以官方就又搞了个更为优雅的异步处理方案。
为什么说它是为理解决 Promise 带来的问题,可以看看 MDN 官网的下面这段话:
async/await 的目的是简化使用多个 promise 时的同步行为,并对一组 Promises 执行某些操作。正如 Promises 相似于结构化回调,async/await 更像结合了 generators 和 promises。
1)、Promise 并不是完美的处理方案
上面提到的那个异步嵌套 setTimeout的例子来说,事实上,大部分人用 Promise 应该并不会像上面的代码那样写,而是下面这样:

其实 Promise.then() 假如使用过多,仍然还是回调地狱,嵌套仍然没有消失,所以来说,Promise 并不能称之为完美的异步方案,ES7 提出了 async function,它用来更为优雅的处理异步

2)、async function 了解
关于 async function,其实并没有过多的 API,由于它更像是一个高级语法糖,官方文档给出的也更多都是使用示例。在这里,其实我们只要要知道并强调一件事 ——?await 关键字用来暂停等待异步函数的执行结束,假如是 Promise,也就是等待它的 settled 状态,并且 await 只能出现在 async function 内部,不可单独使用。
官方给出了一个比较有意思的例子:


第二种没什么可说的,想象中就是这个样子,由于 await 会暂停等待函数执行完之后再向下执行,因而等待时间不会重叠,先等待2秒执行 slow 后再等待1秒执行 fast。
而第一种
上面这两个异步函数由于没有 await 关键字,都是立即执行,因而先输出promise start,之后,两个函数延时不同,尽管 slow 先执行,但是是2秒,而 fast 后执行是1秒,先输出fast done再输出slow done。最后,await 关键字发挥作用,尽管 fast 先执行完,但是你还是要等 await slow 完事之后才能 await fast。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 奇葩!面试说真话居然也能拿offer?