目录

  • 一、异步的概念
    • 回调函数
  • 二、异步的使用
    • 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. 全球40起黑客攻击或与CIA有关 长角牛黑客组织打卡“上班”
  2. UVA227 Puzzle
  3. python3 多进程共享变量实现方法
  4. Linux bc 命令简单学习
  5. 【开始研究Community Server,转贴一点东西】Community Server资料收集
  6. 锤子新机或10月31日发布,罗永浩:与我无关
  7. mysql 最基础的日常操作
  8. bzoj1627[Usaco2007 Dec]穿越泥地*
  9. 在 MQL5 中使用 WININET。第二部分:POST 请求和文件
  10. 大型系统集成项目流程方案设计图
  11. 运放电路增益计算公式
  12. 热血传奇服务端源代码分析笔记
  13. 15款优秀移动APP产品原型设计工具
  14. rsync来实现文件同步
  15. Linux-fsck.ext4
  16. 模板脚手架资质怎么办理
  17. effective morden c++4
  18. 计算机专业社会需要分析,计算机专业社会需求数据分析开题报告.doc
  19. 脚本引流它就是骗局,别逗了
  20. 功率放大器如何进行阻抗匹配测试工作原理

热门文章

  1. NSFC: 研究目标看似简单
  2. 两周年-我的创作纪念日
  3. CDR中如何把一个字分割成两半
  4. How to test Heat (by quqi99)
  5. Oracle 分析函数案例
  6. 未来人工智能手机三大“创新科技”
  7. 音乐播放器之--在线音乐播放
  8. 开学季学生党必备数码好物,什么数码好物值得分享学生党
  9. 前期调查问卷分析报告
  10. 数据库原理与应用-------简单查询(2)