JavaScript 异步
目录
- 一、异步的概念
- 回调函数
- 二、异步的使用
- 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 异步相关推荐
- JavaScript 异步编程--Generator函数、async、await
JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...
- JavaScript异步调用的发展历程
同步与异步 通常,代码是由上而下依次执行的.如果有多个任务,就必须排队,前一个任务完成,后一个任务才能执行.这种连续的执行模式就叫做同步. a(); b(); c(); 复制代码 上面代码中,a.b. ...
- JQuery日记6.5 Javascript异步模式(一)
理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...
- JavaScript异步精讲,让你更加明白Js的执行流程!
JavaScript异步精讲,让你更加明白Js的执行流程! 问题点 什么是单线程,和异步有什么关系 什么是 event-loop jQuery的Deferred Promise 的基本使用和原理 as ...
- 前端知识点回顾之重点篇——JavaScript异步机制
JavaScript异步机制 来源:https://www.cnblogs.com/zhaodongyu/p/3922961.html JavaScript是单线程异步执行的,单线程意味着代码在任务队 ...
- 细说JavaScript异步函数发展历程
2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...
- 写给初学者的JavaScript异步编程和背后思想
导读: 对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了 ...
- 短小强悍的JavaScript异步调用库
原文链接: 7 lines JavaScript library for calling asynchronous functions 翻译人员: 铁锚 翻译时间: 2014年02月18日 示例地 ...
- Javascript异步编程之一异步原理
本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...
- JavaScript异步
JavaScript异步类型 延迟类型:setTimeout.setInterval.setImmediate 监听事件:监听new Image加载状态.监听script加载状态.监听iframe加载 ...
最新文章
- 【 ML 】Newton – Raphson Iteration Procedure of TOA - Based Positioning Simulation
- 你的项目应该如何正确分层?
- [转载]input[type=file]在移动端各浏览器无法适配打开相机的问题。
- Ida双开定位android so文件
- Linux系统下MySQL数据库的超级管理员root的密码忘记/忘记密码怎么办?
- Tensorflow2.0模型构建与训练
- lua5.3 获取table的元素数量
- 关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解
- imx 290 支持25fps
- Cosmos 是什么? 一文了解Cosmos的来龙去脉
- LED设备驱动二之重要代码和调试问题分析
- 开源网络情报(OSINT)定义:对您的企业意味着什么
- Linux下父进程子进程先后终止的不同处理
- 王选:从Dijkstra谈帅才的洞察力
- 电商运营中的五个数据陷阱
- 微信公众号文章爬取方法整理
- DC-DC与LDO的区别
- [LSTM]时间序列预测存在的问题--滑动窗口是一把双刃剑【持续更新】
- matlab取矩阵元素的模,matlab – 提取矩阵元素
- [ 物联网篇 ] 11 - NXP i.MX8M Mini 集成Mender OTA解决方案