目录

  • 一、异步的概念
    • 回调函数
  • 二、异步的使用
    • 1. setTimeout(cb, ms)
    • 2. Promise
    • 3. async 异步函数
    • 4. util.callbackify()
    • 5. fs 系统

一、异步的概念

参考资料:JavaScript 异步编程

同步 Synchronous (sync):按代码顺序执行
异步 Asynchronous (async) :不按代码顺序执行

  • 从主线程发射一个子线程来完成任务
  • 子线程一旦发射了以后就会与主线程失去同步
  • 无法确定它的结束,无法将它合并到主线程中去的。
  • JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

回调函数

Node.js 回调函数

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。

回调函数一般作为函数的最后一个参数出现:
function fun1( ... , fun2(...){...} ) {...}

二、异步的使用

1. setTimeout(cb, ms)

setTimeout()全局函数执行后,产生一个子线程在规定毫秒之后执行回调函数,且只执行一次,返回一个代表定时器的句柄值。

setTimeout(function () {console.log("1");
}, 3000);
console.log("2");

2. Promise

参考资料:
JavaScript Promise
异步函数Async(es2017)

① 概念
Promise 是一个 ECMAScript 6 提供的,目的是更加优雅地书写复杂的异步任务。

② 状态
Promise 对象代表一个异步操作,有三种状态:

  • pending(进行中)
  • resolved(已完成,又称 Fulfilled)
  • rejected(已失败)

执行回调里的 resolve(); 这个 promise 就被标记为 resolverd

③ 构造函数/起始函数
new Promise(function(resolve, reject){...})
Promise 构造函数只有一个参数,是一个函数,这个函数在构造之后会直接被异步运行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject 都是函数:

  • resolve() 代表一切正常。
  • reject() 是出现异常时所调用的。

throw "Some error";或者 reject("Some error")
resolve 和 reject 的作用域只有起始函数,不包括 then 以及其他序列
resolve 和 reject 并不能够使起始函数停止运行,别忘了 return。

//例子
new Promise(function (resolve, reject) {setTimeout(function () {console.log("First");resolve();}, 1000);
})

④ 方法
Promise 类有三个方法,这三个方法的参数都是函数,

  • .then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列
  • .catch() 则是设定 Promise 的异常处理序列,
  • .finally() 是在 Promise 执行的最后一定会执行的序列。

resolve() 中可以放置一个参数向下一个 then 传递一个值
then 中的函数返回一个值,该值传递给下一个 then。
then 中的函数返回一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作。

1.异步函数执行的结果总是一个promise,这个promise在异步函数开始执行的时候被创建。
2.然后函数体被执行,执行可能会通过return或throw永久完成,或者通过await临时完成(这种情况,之后会继续执行)。
3.promise被返回。

当执行异步函数体的时候,return x将会resolve(x),throw err将会reject(err),promise的完成是异步的。换句话说,then(),catch()中的回调函数总是在当前代码完成之后执行。

异步的方法函数最后一个参数为回调函数
回调函数的第一个参数包含了错误信息(error)

3. async 异步函数

参考资料:
ES6 async 函数
async/await 异步函数
异步函数Async(es2017)

async function name([param[, param[, ... param]]]) { statements }

  • 函数声明:async function
  • 参数:
    • name: 函数名称。
    • param: 要传递给函数的参数的名称。
    • statements: 函数体语句。
  • 返回值:async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。

[return_value] = await expression;

  • await 操作符只能在异步函数 async function 内部使用
  • 参数:expression:一个 Promise 对象或者任何要等待的值。
  • 返回值:返回 Promise 对象的处理结果。
    • 如果等待的不是 Promise 对象,则返回该值本身。
    • 如果等待的是 Promise 对象,await 将等待 Promise 正常处理完成并返回其处理结果

4. util.callbackify()

参考资料:
util 实用工具 官网
Node.js 常用工具

util 模块中
util.callbackify(original)
将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数

  • 参数:original 为 async 异步函数。
  • 返回值:返回传统回调函数(或者一个返回值为 Promise 的函数)
    • 在返回的回调函数中,第一个参数为拒绝的原因(如果 Promise 解决,则为 null),第二个参数则是解决的值。
//例子
const util = require('util');async function fn() {return 'hello world';
}
const callbackFunction = util.callbackify(fn);callbackFunction((err, ret) => {if (err) throw err;console.log(ret);
});//结果
hello world

5. fs 系统

参考资料:Node.js 文件系统
fs 模块中有许多函数采用异步方式:如
fs.open(path, flags[, mode], callback) 在异步模式下打开文件
fs.stat(path, callback) 通过异步模式获取文件信息
fs.writeFile(file, data[, options], callback) 异步模式下写入文件
fs.read(fd, buffer, offset, length, position, callback) 异步模式下读取文件,该方法使用了文件描述符来读取文件。
fs.close(fd, callback) 异步模式下关闭文件,该方法使用了文件描述符来读取文件。
fs.ftruncate(fd, len, callback) 异步模式下截取文件,该方法使用了文件描述符来读取文件。

JavaScript 异步相关推荐

  1. JavaScript 异步编程--Generator函数、async、await

    JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...

  2. JavaScript异步调用的发展历程

    同步与异步 通常,代码是由上而下依次执行的.如果有多个任务,就必须排队,前一个任务完成,后一个任务才能执行.这种连续的执行模式就叫做同步. a(); b(); c(); 复制代码 上面代码中,a.b. ...

  3. JQuery日记6.5 Javascript异步模式(一)

    理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...

  4. JavaScript异步精讲,让你更加明白Js的执行流程!

    JavaScript异步精讲,让你更加明白Js的执行流程! 问题点 什么是单线程,和异步有什么关系 什么是 event-loop jQuery的Deferred Promise 的基本使用和原理 as ...

  5. 前端知识点回顾之重点篇——JavaScript异步机制

    JavaScript异步机制 来源:https://www.cnblogs.com/zhaodongyu/p/3922961.html JavaScript是单线程异步执行的,单线程意味着代码在任务队 ...

  6. 细说JavaScript异步函数发展历程

    2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...

  7. 写给初学者的JavaScript异步编程和背后思想

    导读: 对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了 ...

  8. 短小强悍的JavaScript异步调用库

    原文链接:  7 lines JavaScript library for calling asynchronous functions  翻译人员: 铁锚 翻译时间: 2014年02月18日 示例地 ...

  9. Javascript异步编程之一异步原理

    本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...

  10. JavaScript异步

    JavaScript异步类型 延迟类型:setTimeout.setInterval.setImmediate 监听事件:监听new Image加载状态.监听script加载状态.监听iframe加载 ...

最新文章

  1. 【 ML 】Newton – Raphson Iteration Procedure of TOA - Based Positioning Simulation
  2. 你的项目应该如何正确分层?
  3. [转载]input[type=file]在移动端各浏览器无法适配打开相机的问题。
  4. Ida双开定位android so文件
  5. Linux系统下MySQL数据库的超级管理员root的密码忘记/忘记密码怎么办?
  6. Tensorflow2.0模型构建与训练
  7. lua5.3 获取table的元素数量
  8. 关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解
  9. imx 290 支持25fps
  10. Cosmos 是什么? 一文了解Cosmos的来龙去脉
  11. LED设备驱动二之重要代码和调试问题分析
  12. 开源网络情报(OSINT)定义:对您的企业意味着什么
  13. Linux下父进程子进程先后终止的不同处理
  14. 王选:从Dijkstra谈帅才的洞察力
  15. 电商运营中的五个数据陷阱
  16. 微信公众号文章爬取方法整理
  17. DC-DC与LDO的区别
  18. [LSTM]时间序列预测存在的问题--滑动窗口是一把双刃剑【持续更新】
  19. matlab取矩阵元素的模,matlab – 提取矩阵元素
  20. [ 物联网篇 ] 11 - NXP i.MX8M Mini 集成Mender OTA解决方案

热门文章

  1. C语言中的bool变量
  2. Vue的基本实现原理
  3. linux抓包tcpdump并保存,linux下抓包命令--tcpdump的使用
  4. 360线上虚拟现实全景展厅技术的作用
  5. VLAN实验——华为
  6. uniapp微信小程序服务器与行内img src图片路径拼接
  7. css书本效果,如何使用纯CSS实现3D书本效果
  8. 经典的60句话[转贴]
  9. Hive TOP N 实现方法
  10. mysql myisam 优化,mysql myisam 优化设置