目录

1前言

2promise是什么?

2.1举例说明

3异步操作的常见语法

3.1事件监听

3.2回调

4异步回调的问题:

5promise详解

6最简单示例:


1前言

这是来自江苏某公司的初级面试题之一

欢迎大家作为补充

为了本题的完善

2promise是什么?

1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列

2.1举例说明

  • 同步:假设你去了一家饭店,找个位置,叫来服务员,这个时候服务员对你说,对不起我是“同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”。

  • 异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,。等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。
    AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。

3异步操作的常见语法

3.1事件监听

document.getElementById('#start').addEventListener('click', start, false);
function start() {// 响应事件,进行相应的操作
}
// jquery on 监听
$('#start').on('click', start)

3.2回调

// 比较常见的有ajax
$.ajax('http://www.wyunfei.com/', {success (res) {// 这里可以监听res返回的数据做回调逻辑的处理}
})// 或者在页面加载完毕后回调
$(function() {// 页面结构加载完成,做回调逻辑处理
})

有了nodeJS之后...对异步的依赖进一步加剧了

大家都知道在nodeJS出来之前PHP、Java、python等后台语言已经很成熟了,nodejs要想能够有自己的一片天,那就得拿出点自己的绝活:
无阻塞高并发,是nodeJS的招牌,要达到无阻塞高并发异步是其基本保障
举例:查询数据从数据库,PHP第一个任务查询数据,后面有了新任务,那么后面任务会被挂起排队;而nodeJS是第一个任务挂起交给数据库去跑,然后去接待第二个任务交给对应的系统组件去处理挂起,接着去接待第三个任务...那这样子的处理必然要依赖于异步操作

4异步回调的问题:

  • 之前处理异步是通过纯粹的回调函数的形式进行处理
  • 很容易进入到回调地狱中,剥夺了函数return的能力
  • 问题可以解决,但是难以读懂,维护困难
  • 稍有不慎就会踏入回调地狱 - 嵌套层次深,不好维护

一般情况我们一次性调用API就可以完成请求。
有些情况需要多次调用服务器API,就会形成一个链式调用,比如为了完成一个功能,我们需要调用API1、API2、API3,依次按照顺序进行调用,这个时候就会出现回调地狱的问题

5promise详解

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><script>new Promise(function(resolve, reject) {// 一段耗时的异步操作resolve('成功') // 数据处理完成// reject('失败') // 数据处理出错}).then((res) => {console.log(res)}, // 成功(err) => {console.log(err)} // 失败)</script>
</body></html>

运行结果

  • resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
    reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
  • promise有三个状态:
    1、pending[待定]初始状态
    2、fulfilled[实现]操作成功
    3、rejected[被否决]操作失败
    当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
    promise状态一经改变,不会再变。
  • Promise对象的状态改变,只有两种可能:
    从pending变为fulfilled
    从pending变为rejected。
    这两种情况只要发生,状态就凝固了,不会再变了。

6最简单示例:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><script>new Promise(resolve => {setTimeout(() => {resolve('hello')}, 2000)}).then(res => {console.log(res)})</script>
</body></html>

运行结果

分两次,顺序执行

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><script>new Promise(resolve => {setTimeout(() => {resolve('hello')}, 2000)}).then(val => {console.log(val) //  参数val = 'hello'return new Promise(resolve => {setTimeout(() => {resolve('world')}, 2000)})}).then(val => {console.log(val) // 参数val = 'world'})</script>
</body></html>

运行结果

promise完成后then()

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><script>let pro = new Promise(resolve => {setTimeout(() => {resolve('hello world')}, 2000)})setTimeout(() => {pro.then(value => {console.log(value) // hello world})}, 2000)</script>
</body></html>

结论:promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。

本面试题为前端常考面试题,后续有机会继续完善。我是歌谣,一个沉迷于故事的讲述者。

欢迎一起私信交流。

“睡服“面试官系列之各系列目录汇总(建议学习收藏)

“约见”面试官系列之常见面试题第一篇说说promise(建议收藏)相关推荐

  1. “约见”面试官系列之常见面试题第四十一篇之VUE生命周期(建议收藏)

    详解Vue Lifecycle 先来看看VUE官网对VUE生命周期的介绍 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.销毁等一系列过程,我们称 ...

  2. “约见”面试官系列之常见面试题第九篇vue实现双向绑定原理(建议收藏)

    目录 1.原理 2.实现 在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫m ...

  3. “约见”面试官系列之常见面试题第二篇说说rem(建议收藏)

    目录 1.什么是rem? 2.为什么要用rem(rem有什么优点)? 怎样使用rem? 1.什么是rem? rem(font size of the root element)是指相对于根元素的字体大 ...

  4. “约见”面试官系列之常见面试题之第九十五篇之vue-router的组件组成(建议收藏)

    <router-link :to='' class='active-class'> //路由声明式跳转 ,active-class是标签被点击时的样式<router-view> ...

  5. “约见”面试官系列之常见面试题之第九十四篇之MVVM框架(建议收藏)

    目录 一句话总结:vm层(视图模型层)通过接口从后台m层(model层)请求数据,vm层继而和v(view层)实现数据的双向绑定. 1.我大前端应该不应该做复杂的数据处理的工作? 2.mvc和mvvm ...

  6. “约见”面试官系列之常见面试题之第九十三篇之vue获取数据在哪个周期函数(建议收藏)

    然后必须知道一点,vue是数据驱动的(只关心data即可),换句话说,就是,只要我能操作到 data中的数据即可. 所以,根据上面的生命周期,其实你放到 mounted中完全可以,因为这个阶段data ...

  7. “约见”面试官系列之常见面试题之第九十二篇之created和mounted区别(建议收藏)

    beforeCreate 创建之前:已经完成了 初始化事件和生命周期 created 创建完成:已经完成了 初始化注册和响应 beforeMount 挂载之前:已经完成了模板渲染 mounted :挂 ...

  8. “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)

    答:beforeCreate:在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建.在beforeCreate生命周期执行的时候,data和methods中的数据都还没 ...

  9. “约见”面试官系列之常见面试题之第九十篇之页面加载触发函数(建议收藏)

    第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子 本面试题为前端常考面试题,后续有机会继续完善.我是歌谣,一个沉迷于故事的讲述 ...

最新文章

  1. (一)神经网络入门之线性回归
  2. 三角函数公式总结(四)
  3. 没有工作经验找it_没有工作经验怎么找工作?
  4. 大学生们颤抖吧,中学生已经开始学Python了!
  5. 用Arduino+OSC建立一个iPad铁路王国巡视机
  6. All In One For Firefox 3
  7. 虚拟机无法安装VMware Tools
  8. (76) Clojure: Why would someone learn Clojure? - Quora
  9. break用于什么场景python_break语句陷入循环
  10. 颠覆传统网络管理 Aruba新一代网络解决方案重磅呈现
  11. Linux安装谷歌拼音中文输入法
  12. docker-compose 安装常用服务
  13. 解决SQL Server日志空间满的方法
  14. 扫描枪识别条码为乱码
  15. Linux中的计划任务—Crontab调度一次性执行的任务at/batch
  16. 基于TCGA及SEER等癌症公共数据库的深度挖掘和科研设计会议
  17. 研究生毕业后,再重新读个硕士
  18. SEO优化与SEM(竞价)区别在哪?
  19. 著名的海龟式期货交易系统完整版来了!值得收藏!
  20. codeforces Hello 2021

热门文章

  1. java集合(1)-概述
  2. 实际算法项目工程上手日志C/C++
  3. mybatis下log4j使用
  4. python webdriver 常用元素操作
  5. Java 理论与实践:让 J2EE 脱离容器
  6. Moblin在MID软件系统中扮演三个关键角色........
  7. LINQ - 對付 SQL Injection 的 免費補洞策略 (转)
  8. JSP实战型程序连载:通用数据库连接JavaBean
  9. graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...
  10. java 简单图片浏览器_Java实现简单的图片浏览器