ES6:【深扒,在一家公司干多长时间跳槽才合适,【深夜思考

  1. 定时器的回调

  2. Ajax 请求

Promise

采用回调函数的方法,本身是没有问题的,但是问题出现在多个回调函数的嵌套

想一想,我执行完执行你,你执行完执行他,他执行完又执行她…

是不是需要层层嵌套,那这样套娃式的操作显然不利于阅读

fs.readFile(fileA, ‘utf-8’, function (err, data) {

fs.readFile(fileB, ‘utf-8’, function (err, data) {

// …

});

});

同时你也可以这样去思考一下,如果有其中一个代码需要修改,那它的上层回调和下层回调都要修改,这也叫做强耦合

耦合,藕断丝连,关联性很强的意思

这种场景也叫做“回调地狱”

而 Promise 对象的诞生就是为了解决这个问题,它采用了以一种全新的写法,链式调用

Promise 可以用来表示一个异步任务执行的状态,有三种状态

  • Pending:开始是等待状态

  • Fulfilled:成功的状态,会触发 onFulfilled

  • Rejected:失败的状态,会触发 onRejected

它的写法如下

const promise = new Promise(function(resolve, reject) {

// 同步代码

// resolve执行表示异步任务成功

// reject执行表示异步任务失败

resolve(100)

// reject(new Error(‘reject’)) // 失败

})

promise.then(function() {

// 成功的回调

}, function () {

// 失败的回调

})

Promise 对象调用 then 方法后会返回一个新的 Promise 对象,这个新的 Promise 对象可以继续调用 then 实现链式调用

后面的 then 方法是为上一个 then 返回的 Promise 对象注册回调

前一个 then 方法中回调函数的返回值会作为后面 then 方法回调的参数

链式调用的目的是为了解决回调函数嵌套的问题

关于 Promise 的更多细节这里就不多说了,下一篇写吧~

坏了,坏了,环环嵌套,我陷入回调地狱了,努力更文

Promise 成功的解决了回调地狱的问题,它又不是异步编程的终极方案,那它又带来了什么问题呢?

  1. 无法取消 Promise

  2. 当处于 pending 状态时是,无法得知进展

  3. 错误不能被 catch

但是这些都不是 Promise 的最大问题,它最大的问题是代码冗余,当执行逻辑变得复杂时,代码的语义会变得很不清楚,全是 then

其实看过上一篇文章的读者们,看到这里应该对 Generator 实现异步编程有了一定的眉目,这里的 then 方法的作用,似乎 next 方法也能实现,启动,运行,传参,接下来我们来细说一下

Generator

Generator 函数可以暂停执行恢复执行, 这是它能封装异步任务的根本原因。

除此之外,它还有两个特征,使它可以作为异步编程的完美解决方案。

  • 函数体内外的数据传递

  • 错误处理机制

数据传递

在学习它是如何实现异步编程的之前,我们先回顾一下 Generator 函数的执行方法

// 声明Generator函数

function* gen(x){

let y = yield x + 2

return y

}

// 遍历器对象

let g = gen()

// 第一次调用next方法

g.next() // { value: 3, done: false }

// 第二次调用 传递参数

g.next(2) // { value: 2, done: true }

首先执行 gen 函数,获得遍历器对象,此时函数并不会执行,当调用遍历器对象的 next 方法时,执行到第一个 yield 语句,以此类推

也就是说只有调用 next 方法,才会往下执行

同时在上面的代码中,我们可以通过 value 来获取返回的值,通过给 next 方法传递参数来实现数据交换

错误处理机制

Generator 函数内部可以部署错误处理代码,捕获函数体外抛出的错误

function* gen(x){

try {

var y = yield x + 2;

} catch (e){

console.log(e);

}

return y;

}

var g = gen(1);

g.next();

g.throw(‘出错了’);

或许会有人不理解为什么内部的 catch 可以捕获外部的错误?

原因是我们通过 g.throw 来抛错误,其实是将错误抛入了生成器,毕竟我们是在 p 上来调用 throw 方法

实现异步编程

在我的上一篇文章详细的介绍了生成器的执行机制,以及 yield 执行特点,可以先阅读一下

我们主意利用 yield 暂停生成器函数执行的特点,来使用生成器函数去实现异步编程,我们来看一个例子

Generator + Promise

function * main () {

const user = yield ajax(‘/api/usrs.json’)

console.log(user)

}

const g = main()

const result = g.next()

result.value.then(data => {

g.next(data)

})

首先我们定义一个生成器函数 main ,然后在这个函数内部使用 yield 去返回一个 ajax 的调用,也就是返回了一个 Promise 对象。

然后去接收 yield 语句的返回值,也就是第二个 next 方法的参数。

我们可以在外界去调用生成器函数得到它的迭代器对象,然后调用这个对象的 next 方法,这样 main 函数就会执行到第一个 yield 的位置,也就是会执行到 ajax 的调用,这里 next 方法返回对象的 value 值就是 ajax 返回的 Promise 对象

因此我们可以通过 then 方法去指定这个 Promise 的回调,在这个 Promise 回调中我们就可以拿到这个 Promise 的执行结果 data,这时候我们就可以通过再调用一次 next 方法,把我们得到的 data 数据传递出去,这样 main 函数就可以继续执行了,而 data 就会被当作 yield 表达式的返回值赋值给 user 使用了

异步迭代生成器

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

这里分享一份由字节前端面试官整理的「2021大厂前端面试手册」,内容囊括Html、CSS、Javascript、Vue、HTTP、浏览器面试题、数据结构与算法。全部整理在下方文档中,共计111道

HTML

  • HTML5有哪些新特性?

  • Doctype作⽤? 严格模式与混杂模式如何区分?它们有何意义?

  • 如何实现浏览器内多个标签页之间的通信?

  • ⾏内元素有哪些?块级元素有哪些? 空(void)元素有那些?⾏内元 素和块级元素有什么区别?

  • 简述⼀下src与href的区别?

  • cookies,sessionStorage,localStorage 的区别?

  • HTML5 的离线储存的使用和原理?

  • 怎样处理 移动端 1px 被 渲染成 2px 问题?

  • iframe 的优缺点?

  • Canvas 和 SVG 图形的区别是什么?

JavaScript

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 问:0.1 + 0.2 === 0.3 嘛?为什么?

  • JS 数据类型

  • 写代码:实现函数能够深度克隆基本类型

  • 事件流

  • 事件是如何实现的?

  • new 一个函数发生了什么

  • 什么是作用域?

  • JS 隐式转换,显示转换

  • 了解 this 嘛,bind,call,apply 具体指什么

  • 手写 bind、apply、call

  • setTimeout(fn, 0)多久才执行,Event Loop

  • 手写题:Promise 原理

  • 说一下原型链和原型链的继承吧

  • 数组能够调用的函数有那些?

  • PWA使用过吗?serviceWorker的使用原理是啥?

  • ES6 之前使用 prototype 实现继承

  • 箭头函数和普通函数有啥区别?箭头函数能当构造函数吗?

  • 事件循环机制 (Event Loop)


么是作用域?

  • JS 隐式转换,显示转换

  • 了解 this 嘛,bind,call,apply 具体指什么

  • 手写 bind、apply、call

  • setTimeout(fn, 0)多久才执行,Event Loop

  • 手写题:Promise 原理

  • 说一下原型链和原型链的继承吧

  • 数组能够调用的函数有那些?

  • PWA使用过吗?serviceWorker的使用原理是啥?

  • ES6 之前使用 prototype 实现继承

  • 箭头函数和普通函数有啥区别?箭头函数能当构造函数吗?

  • 事件循环机制 (Event Loop)

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值