撩课-Web大前端每天5道面试题-Day21
1.对async、await的理解,内部原理?
- ①async---声明一个异步函数:
- 自动将常规函数转换成promise,返回值也是一个promise对象,
- 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数,内部可以使用await;
- ②await--暂停异步的功能执行:
- 放在promise调用之前,await强制其他代码等待,直到promise完成并返回结果,
- 只能与promise一起使用,不适用于回调,只能在async函数内部使用。
- 下面介绍下使用场景:
- a.同时发出三个互不依赖的请求,
- 不建议使用
- async/awaitasync function getABC() {
- let A= await getValueA();//A needs 2 second
- let B= await getValueB();//B needs 2 second
- let C= await getValueC();//C needs 2 second
- return A*B*C;
- }
- 复制代码上图所示,
- 上面我们A需要2s,B需要4s,C需要3s,
- 我们如上图所示发请求,就存在彼此依赖的关系,c等b执行完,b等a执行完,
- 从开始到结束需要(++)9s。
- 此时我们需要用Promise.all()将异步调用并行执行,
- 而不是一个接一个执行,
- 如下所示:
- async function getABC() {
- let results = await Promise.all([getValueA,getValueB,getValueC]);
- return results.reduce((total,value)=>total*value)
- }
- 复制代码这样将会节省我们不少的时间,从原来的的9s缩减到4s。
- b.一个需要验证码提交表单的页面请求,
- 此时使用async/await会更好常规代码
- const call1Promise = fetch('/#1...');
- call1Promise.then(response=>response.json())
- .then(json=>{
- //验证码返回后的后续操作
- const call2Promise = fetch('/#2...');
- return call2Promise;
- })
- .then(response=>response.json())
- .then(json=>{
- console.log(json.respCode);
- })
- .catch(err=>{
- console.log(err);
- })
- 复制代码用Async/Await的方式将逻辑分装在一个async函数里,
- 这样就可以直接对promise使用await了,也就规避了写then回调。
- 最后我们调用这个async函数,然后按照普通的方式使用返回的promise。
- 美哉!
- async function postForm(){
- try{
- //验证码是否通过,拿到返回的json
- const response1 = await fetch('/#1...');
- const json1 = await response1.json();
- let json2;
- //对第一个请求的返回数据进行判断
- // 满足条件则请求第二个接口并返回数据
- if(json1.respCode===){
- const response2 = await fetch('/#2...');
- json2 = await response2.json();
- }
- return json2;
- }catch(e){
- console.log(e);
- }
- }
- 简单的模拟场景
- 2.介绍下Promise,内部实现?
- promise从字面上理解就是承诺,即未来完成的事儿。
- 从语法上来看,它是一个对象,
- 从它这里可以获取下一步操作的消息,
- 而promise对象的状态不受外部影响。
- 相关代码如下:
- const PENDING = 'pending'; //初始状态
- const FULFILLED = 'fulfilled'; // 成功状态
- const REJECTED = 'rejected'; // 失败状态
- function Promise(extutor){
- let self = this;
- self.status = PENDING; // 设置状态
- // 存放成功回调的数组
- self.onResolveCallbacks = [];
- // 存放失败回调的数组
- self.onRejectedCallbacks = [];
- function resolve(value){
- if(self.status === PENDING){
- self.status = FULFILLED;
- self.value = value;
- self.onResolveCallbacks.forEach(cb => cd(self.value))
- }
- }
- function reject(reason){
- if(self.status === PENDING){
- self.status = REJECTED;
- self.value = reason;
- self.onRejectCallbacks.forEach(cb => cd(self.value))
- }
- }
- try{
- excutor(resolve, reject)
- } catch(e) {
- reject(e)
- }
- }
3.Http请求中的keep-alive有了解吗?
- 在http早期,每个http请求都要求打开一个tpc socket连接,
- 并且使用一次之后就断开这个tcp连接。
- 使用keep-alive可以改善这种状态,
- 即在一次TCP连接中可以持续发送多份数据而不会断开连接。
- 通过使用keep-alive机制,可以减少tcp连接建立次数,
- 也意味着可以减少TIME_WAIT状态连接,
- 以此提高性能和提高http服务器的吞吐率
- (更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
- 但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。
- 配置不当的keep-alive,有时比重复利用连接带来的损失还更大。
- 所以,正确地设置keep-alive timeout时间非常重要。
4.http中的状态码302代表的是什么意思?
- 302重定向表示临时性转移(Temporarily Moved ),
- 当一个网页URL需要短期变化时使用。
- 顺便提一嘴301301重定向/跳转一般,
- 表示本网页永久性转移到另一个地址。
- 301是永久性转移(Permanently Moved),SEO常用的招式,
- 会把旧页面的PR等信息转移到新页面301重定向与302重定向的区别
- 301重定向是永久的重定向,
- 搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
- 302重定向是临时的重定向,
- 搜索引擎会抓取新的内容而保留旧的网址。
- 因为服务器返回302代码,
- 搜索引擎认为新的网址只是暂时的。
5.请描述utf-8和unicode的区别?
- Unicode 是「字符集」UTF- 是「编码规则」Unicode是一套复杂的字符编码标准,
- 简单来说就是将人类使用的每个所谓字符与一个非负整数对应,
- 并且保证不同的字符对应的整数一定不同。
- UTF-8是这个整数的编码方式,用1到4字节来表达一个整数。
- 关系:UTF-8是Unicode的实现方式之一,
- 它规定了字符如何在计算机中存储、传输等。
撩课-Web大前端每天5道面试题-Day21的更多相关文章
- 撩课-Web大前端每天5道面试题-Day10
1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...
- 撩课-Web大前端每天5道面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理: ) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数; ) 创建一个数组,长度为列数, 里面的值为已布置元素 ...
- 撩课-Web大前端每天5道面试题-Day1
1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量: 2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到 ...
- 撩课-Web大前端每天5道面试题-Day11
1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...
- 撩课-Web大前端每天5道面试题-Day31
1.web storage和cookie的区别? Web Storage的概念和cookie相似, 区别是它是为了更大容量存储设计的. Cookie的大小是受限的, 并且每次你请求一个新的页面的时候C ...
- 撩课-Web大前端每天5道面试题-Day25
1.web前端开发,如何提高页面性能优化? 内容方面: .减少 HTTP 请求 (Make Fewer HTTP Requests) .减少 DOM 元素数量 (Reduce the Number o ...
- 撩课-Web大前端每天5道面试题-Day7
1. 你能描述一下渐进增强和优雅降级之间的不同吗? 定义: 优雅降级(graceful degradation): 一开始就构建站点的完整功能, 然后针对浏览器测试和修复 渐进增强(progressi ...
- 撩课-Web大前端每天5道面试题-Day30
1.什么叫优雅降级和渐进增强? 优雅降级: Web站点在所有新式浏览器中都能正常工作, 如果用户使用的是老式浏览器, 则代码会针对旧版本的IE进行降级处理了, 使之在旧式浏览器上以某种形式降级体验却不 ...
- 撩课-Web大前端每天5道面试题-Day23
1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...
随机推荐
- OSLab课堂作业1
日期:2019/3/16 作业:实现命令cat, cp, echo. myecho命令 #include <stdio.h> int main(int argc, char *ar ...
- 基于Spring Boot的Logback日志轮转配置
在生产环境下,日志是最好的问题调试和跟踪方法,因此日志的地位是十分重要的.我们平时经常使用的log4j,slf4j,logback等等,他们的配置上大同小异.这里就结合Spring Boot配置一下L ...
- 在Linux CentOS上部署Asp.Net Core项目(Tengine、Asp.Net Core、Centos、MySql)
一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...
- day 17python 面对对象之继承
一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A ...
- javascript中创建对象的几种不同方法
javascript中创建对象的几种不同方法 方法一:最直白的方式:字面量模式创建 <script> var person={ name:"小明", age:20, s ...
- 多项式求逆元详解+模板 【洛谷P4238】多项式求逆
概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...
- java基本语法一
1 关键字和保留字 1.1 关键字 关键字的定义:被java语言赋予了特殊含义,用做专门用途的字符串(单词). 关键字的特点:关键字中的所有字母都是小写. 1.2 保留字 java保留字:现有Java ...
- LayoutInflater.inflate源码分析
基于Android 4.2.2做的分析 parser里封装了layout的dom对象,从中可以获取各节点参数 root为layout对应根节点的父节点,其作用见上述文档解释,需要注意一点的是,root ...
- 剑指offer四十三之左旋转字符串
一.题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- (转)Windows下MySQL :GUI安装和使用(MySQL GUI tools)
原文:http://blog.csdn.net/dahunbi/article/details/52970815 MySQL GUI Tools是MySQL官方提供的图形化管理工具,功能很强大,值得推 ...