javascript的天生单线程特性,使得异步编程对它异常重要,早期的通常做法是用回调函数来解决。但是随着逻辑的复杂,和javascript在服务端的大显神通,使得我们很容易就陷入“回调陷井”的万丈深渊。对于异步编程问题的解决人们绞尽脑汁。

  • 传统的解决方案

  在ES6之前的传统解决方案有:回调函数,事件监听(事件发布/订阅)。

  • Promise解决方案

  Promise作为一种异步编程的解决方案,最早由社区提出和实现,ES6将其标准化,原生提供了Promise对象。

  Promise其实就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

  ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

  下面代码创造了一个Promise实例。

const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});

  Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

  Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {// success
}, function(error) {// failure
});

  then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

  下面是一个Promise对象的简单例子。

function timeout(ms) {return new Promise((resolve, reject) => {setTimeout(resolve, ms, 'done');});
}timeout(100).then((value) => {console.log(value);
});

  上面代码中,timeout方法返回一个Promise实例,表示一段时间以后才会发生的结果。过了指定的时间(ms参数)以后,Promise实例的状态变为resolved,就会触发then方法绑定的回调函数。

  Promise 新建后就会立即执行。

  • async函数解决方案

  ES2017 标准引入了 async 函数,使得异步操作变得更加方便。它就是 Generator 函数的语法糖。

  前文有一个 Generator 函数,依次读取两个文件。

const fs = require('fs');const readFile = function (fileName) {return new Promise(function (resolve, reject) {fs.readFile(fileName, function(error, data) {if (error) return reject(error);resolve(data);});});
};const gen = function* () {const f1 = yield readFile('/etc/fstab');const f2 = yield readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());
};

写成async函数,就是下面这样。

const asyncReadFile = async function () {const f1 = await readFile('/etc/fstab');const f2 = await readFile('/etc/shells');console.log(f1.toString());console.log(f2.toString());
};

转载于:https://www.cnblogs.com/zixian/p/9818220.html

JavaScript异步编程解决方案探究相关推荐

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

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

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

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

  3. 网页javascript加载不出_写给初学者的JavaScript异步编程和背后思想

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

  4. JavaScript异步编程【下】 -- Generator、Async/await

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在JavaScript异步编程[上]和 JavaScript异步编程[中]中,我们已经讲到了处理异步编程的两种方法:回调函数 和 Promise. ...

  5. 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)

    [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...

  6. JavaScript异步编程

    JavaScript异步编程 一.概述 1.单线程模型 2.同步任务和异步任务 3.任务队列和事件循环 4.异步操作的模式 回调函数 事件监听 发布/订阅 5.异步操作的流程控制 串行执行 并行执行 ...

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

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

  8. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在我们学习JavaScript中,我们知道,JavaScript的执行环境是单线程的.所谓单线程是指一次只能完成一个任务,如果有多个任务,就必须排队 ...

  9. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

最新文章

  1. 36晋级12第四场:评委弃权 无人晋级
  2. javascript篇-console.log()打印object却显示为字符串[object object]
  3. logic多分类的两种类别
  4. 人脸识别(一)——从零说起
  5. root cause of error messagw for a mixed usage of 01 and 03
  6. 2019-1、CentOS7+安装Tengine_2_3_2(Nginx 1_17_0)
  7. mysql日志文件转存_【转】Mysql日志文件
  8. 彼尔盖茨的十句话,绝对让你改变一生
  9. Mr.Xu的找实习之路
  10. uboot移植——uboot配置过程详解
  11. 苹果手机向windows电脑传照片和视频 无法链接设备或连接到系统上的设备没有发挥作用解决方法
  12. 【Pycharm教程】Pycharm下载安装、配置与测试
  13. 【调剂】上海海洋大学大数据和遥感方向接收硕士调剂
  14. 起点web端体验报告
  15. 用友携YonSuite亮相云栖大会,全方位生态合作再提速
  16. 功能测试需要从那几个方面入手
  17. IdeaUI快捷键注释不在行首
  18. SINS/GNSS组合导航:SINS误差模型
  19. 公司绝对不会告诉你的潜规则 - 看到职场如战场了吧
  20. html网页制作期末大作业成品_网页设计期末作业-简洁源码-我的学校

热门文章

  1. 升级WordPress时提示”另一更新正在进行”
  2. oracle常用sql命令
  3. 初论函数指针、指针函数、指针的指针
  4. 勇士斗恶龙:没那么复杂的Js闭包(改)
  5. 离开页面提示是否保存页面修改内容的简单实现
  6. SOA改变的企业软件生态
  7. 初识FPGA CLB之LUT实现逻辑函数
  8. centos 光盘 mysql_Centos6.5 使用光盘镜像系统源安装数据库mysql5.7
  9. python netsnmp_使用 Net-SNMP 和 IPython
  10. 二极管7种应用电路详解之五