javascript 异步编程

并发

异步编程和函数式自定义组件

关于在前端开发过程中遇到有关

目录

1.1 在 JavaScript 中并发和异步编程
  • 什么是并发和异步编程
  • callback(回调函数)
  • promise
  • iterator (迭代器)
  • generator (生成器)
  • async/wait
  • 在项目中的实现
1.2 函数式自定义组件
  • 自定义组件需求
  • 具体实现

1. 在 JavaScript 中并发和异步编程

1.1 概述

在同一个阶段或时期可以进行多个任务处理,这些任务通常是耗时的,类似 IO 操作读取文件(nodejs)或是网络请求。


[图片上传中...(image-9a4d40-1558701480568)]

实现这样需求通常是两种方式

1.1.2 阻塞(同步)
  • 易于编写
  • 多线程来实现
  • 频繁的内存和线程上下文切换 Memory and context-switching overhead
1.1.2 非阻塞(异步)
  • 单线程
  • 通过较低内存可以实现高并发
  • 适合 UI 和 IO 服务而非 CPU - bound(event-loop)

当下几乎 JavaScript 引擎都是非阻塞/事件驱动的方式来实现高并发

1.1.3 可能阻塞情况

以下情况可能会会阻塞主线程

  • alert/prompt/confirm
  • 同步的 XMLHttpRequest
  • node 中一些同步 API 例如 fs.readFileSync


    evolution.jpg
1.1.5 历史
  • 回调函数
  • jQuery 的 defer
  • promise(angularjs 项目中使用)
  • async/wait
1.1.6 几个方便对比这些回调的优点和缺点
  • 易维护
  • 代码可读性
  • 顺序执行异步
  • 同步执行异步
  • 错误处理

场景:通过组织获取该组织下成员 id 集合,然后遍历成员(顺序) id 获取每一个成员的信息(并发)。

1.2 callback(回调函数)

  • 在 for/while 中实现回调
1.2.1 优点
  • 相对比较底层的抽象
  • 性能不错(因为是底层)
  • 全能(几乎可以解决所有的异步的问题)
1.2.2 缺点
  • 无论是顺序和还是同步实现起来都比较困难
  • 难于在 while/for 或是 try/catch 中使用
  • 难于错误处理
  • 维护难(以上的总结)
1.2.3 复杂度
  • 链式调用(回调金字塔)
  • 组合
const fs = require('fs');

fs.readFile('a.txt',(err,data)=>{
    if(err) return;
    console.log(data.toString());
})
promise

1.3 promise

promise 就是一个对象,在未来的时间执行内部的 resolve 方法,

 function fetchAvatarUrl(userId){

    return fetch(`https://catappapi.herokuapp.com/users/${userId}`)
        .then(response => response.json())
        .then(data => data.imageUrl)
}
  • map/filter 返回的是

1.5 iterator(迭代器)

只要对象实现了[Symbol.]

1.5.1 接口

在 OOP 编程思想中我们少不了接口概念,什么是接口,接口是一种契约是一种行为规范。接口和类概念在现代语言变得模糊。在 Typescript 和 class 接口可以相互替换和继承的。
接口可以可以看出一类具有相同行为,就是按事物的行为进行划分。所以接口也可以看做类型。

1.5.2 在 JavaScript 中接口的实现
1.5.3 什么是 Symobl

唯一性,

1.5.5 iterator 内部机制

[demo2.js)


pause-time.jpg

1.6 generator(生成器)

是一个特殊函数,与一般函数不同定义时候通常在 function 后面添加 * 来和普通函数进行区别,

1.7 async/wait

async 实际就是返回一个 promise


    // await 返回的是实际数据而不是 promise 如果不用 await
    const response = await fetch(`https://catappapi.herokuapp.com/users/${userId}`)
    response
    response.json();
}


图1

正常 fectch 返回一个 promise 对象。

图2

如果在 async 函数中在一个表达式添加一个 await 代码在函数中执行到此处会暂停等到异步表达式执行完毕后返回的是一个返回对象而非 promise 对象

图3

修改代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 前言 从我们一开始学习JavaScript的时候就听到过一段话:JS是单线程的,天生异步,适合IO密集型,不适合C...
    liuxuan阅读 567评论 0 6
  • 还记得一年前写过一篇关于JavaScript异步编程简述的文章,主要介绍了JavaScript的单线程特性与异步编...
    极乐君阅读 389评论 1 7
  • 一、 一道面试题 前段时间面试,考察比较多的是js异步编程方面的相关知识点,如今,正好轮到自己分享技术,所以想把j...
    eraser123阅读 704评论 3 5
  • 异步编程在JavaScript中非常重要。过多的异步编程也带了回调嵌套的问题,本文会提供一些解决“回调地狱”的方法...
    AlienZHOU阅读 27,496评论 2 52
  • 所谓"异步",简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,当第一段有了执行结果之后,再回过头执...
    DJL箫氏阅读 432评论 0 2