添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
多情的创口贴  ·  CefSharp 与 js 相互调用 - ...·  12 小时前    · 
有爱心的饼干  ·  《前端面试题》- ...·  1 年前    · 
呐喊的柿子  ·  chrome ...·  1 年前    · 
爱搭讪的猴子  ·  java.net.ProtocolExcep ...·  1 月前    · 
至今单身的风衣  ·  Fetch 下载进度 ...·  1 年前    · 
爱笑的日记本  ·  Node.js ORM 框架 ...·  1 年前    · 
酒量小的手电筒  ·  python - ...·  1 年前    · 

1995年,当时最流行的浏览器——网景中开始运行 JavaScript (最初称为 LiveScript)。 1996年,微软发布了 JScript 兼容 JavaScript。随着网景、微软竞争而不断的技术更新,在 2000年前后,JavaScript 相关的技术基础准备就绪。 随后到 2005 年前后,以 Google 为首开始重视使用 AJAX(即 Asynchronous JavaScript and XML),使得复杂的网页交互体验接近桌面应用。

然后,随着 Web 应用变得越来越复杂 ,JavaScript 的生态和重要性也日益提升,YUI、prototype.js、jQuery 等各种库相应登场,随之而来就到了 JavaScript 的繁荣期。

2008年,Google 发布了 JavaScript 引擎 V8 大大改善了 JavaScript 的执行速度,进一步推动了 JavaScript 的繁荣,也为 JavaScript 进军服务器端打下了基础(如:Node.js)。

顺序执行异步函数

异步为 JavaScript 带来非阻塞等优势的同时,同时也在一些场景下带了不便,如:顺序执行异步函数,下面总结了一些常用的方法。

1. “回调地狱”

随着应用复杂度几何式增加,我们可能遇到下面“回调地狱”式的代码。

// 第一个任务
function task1 (callback) {
  setTimeout(() => {
    console.log('1', '我是第一个任务,必须第一个执行');
    callback && callback(1);
  }, 3000);
// 第二个任务
function task2 (callback) {
  setTimeout(() => {
    console.log('2', '我是第二个任务');
    callback && callback(2);
  }, 1000);
// 第三个任务
function task3 (callback) {
  setTimeout(() => {
    console.log('3', '我是第三个任务');
    callback && callback(3);
  }, 1000);
// 所有任务
function allTasks () {
  task1((cb1) => {
    if (cb1) {
      task2((cb2) => {
        if (cb2) {
          task3((cb3) => {
            if (cb3) {
              // 顺序完成所有任务
allTasks();
 * 3秒后
 * 1 我是第一个任务,必须第一个执行
 * 1秒后
 * 2 第二个任务
 * 1秒后
 * 3 第三个任务
 

2. Promise

  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

为了避免“回调地狱”带来的复杂性和不易阅读,ES6 推出了 Promise。这次实现起来简单多了,但还存在 Promise 中嵌套多层 Promise 的问题,似乎又回到了类似“回调地狱”的问题上。

new Promise(resolve => {
  setTimeout(() => {
    console.log('1', '我是第一个任务,必须第一个执行');
    resolve(1);
  }, 3000);
}).then((val) => {
  new Promise(resolve => {
    setTimeout(() => {
      console.log('2', '我是第二个任务');
      resolve(2);
    }, 1000);
  }).then(val => {
    setTimeout(() => {
      console.log('3', '我是第三个任务');
    }, 1000); 
 * 3秒后
 * 1 我是第一个任务,必须第一个执行
 * 1秒后
 * 2 第二个任务
 * 1秒后
 * 3 第三个任务
 

3. Await、Async

确保支持,详细见:https://caniuse.com/#search=async
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await

为了更易书写和阅读来实现顺序执行异步函数,ES2017 新增了 awaitasync。这次书写体验非常的棒,就像写同步代码一样完成了顺序执行异步的需求。

* 第一个任务 function task1 () { return new Promise(resolve => { setTimeout(() => { console.log('1', '我是第一个任务,必须第一个执行'); resolve('done'); }, 3000); * 第二个任务 function task2 () { return new Promise(resolve => { setTimeout(() => { console.log('2', '第二个任务'); resolve('done'); }, 1000) * 第三个任务 function task3 () { return new Promise((resolve, reject) => { setTimeout(() => { console.log('3', '第三个任务'); reject('error'); }, 1000); * 第四个任务 function task4 () { return new Promise(resolve => { setTimeout(() => { console.log('4', '第四个任务'); resolve('done'); }, 2000); * 所有任务 async function allTasks () { await task1(); await task2(); await task3(); await task4(); // 执行任务 allTasks(); * 3秒后 * 1 我是第一个任务,必须第一个执行 * 1秒后 * 2 第二个任务 * 1秒后 * 3 第三个任务 * Uncaught (in promise) error 基于 Node.js,通过 Await 、Async、Promise 实现的顺序执行异步,爬取豆瓣电影截图并按顺序一张张下载图片。
  • https://github.com/givebest/node-sync-download
  • 《JavaScript编程全解》
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/
js里面,偶尔会遇见需要多个异步按照顺序执行请求,又不想多层嵌套,,这里和promise.all的区别在于,promise或者Jquery里面的$.when 是同时发送多个请求,一起返回,发出去的顺序是一起;这里是按照顺序发请求 首先创建一个迭代器,接收任意多个函数参数 function nextRegister(){ var args = arguments; var count = 0; var comm = {}; function nextTime(){ count++; if(count < args 可见,位于递归语句前的代码是按由外到内的顺序执行的 注意:这里说的是递归语句前的代码是按由外到内的顺序执行的,而不是整个函数执行顺序,对于整个函数执行顺序肯定都是从内到外的,因为它是递归嘛 当执行 f(3) 时,在 f(3) 内部的执行顺序为先执行 prin 浏览器打开 1. setTimeout直接来个例子:setTimeout异步任务属于宏任务。2. PromisePromise本身是同步的立即执行函数, 当在executor执行resolve或者reject的时候, 此时是异步操作, 会先执行then/catch等,当主栈完成后,才会去调用resolve/reject存放的方法执行,打印p的时候,是打印的返回结果,一个Promise实例。打印:当JS主线... 浏览器打开 相信大家都有听说js引擎是单线程执行,单线程执行也其实也就是指js执行过程是从上到下一口气执行完的,线程是操作系统的最小执行单元,单线程如何实现异步呢?其实js的异步必须要配合第三方的API来完成,这个过程是js通知第三方的API去完成一项任务,在这个过程js继续执行下面的任务,等到第三方的API完成后会将js的回调函数放在浏览器维护的一个任务队列,待js引擎处理完当前的执行栈后,会去... 浏览器打开 要确定请求完成 js 文件,才执行相关的代码。 场景,引用了百度地图的 js-sdk, 需要实例化 SDK 对象,但是这个引用加载JS-SDK文件其实是异步的,在没请求完成之前就实例化对象就会报错,提示找不到该对象。 解决办法: function LoadBaiduMapScript() { //console.log("初始化百度地图脚本..."); const AK =... 浏览器打开 JS异步执行机制——事件循环(Event Loop)本文首发地址:前端基础 | JS异步执行机制--事件循环(Event Loop)​www.brandhuang.com 先祭出一段代码,你清楚它的输出结果吗console点击查看答案`script start` 要想知道为什么输出这样的结果,就得弄明白事件循环(Event loop)是如何处理任务(tasks)和微任务(microtasks)... 浏览器打开 JS的同步与异步 个人笔记,欢迎友好交流讨论。关于同步、异步、微任务、宏任务、事件轮询、如何实现异步编程,内容较多,目前只学习了一小部分,继续gogogo!!! 单线程与多线程 JS是一门单线程的语言。单线程:如果在同一时间有多个任务,这些任务就需要排队执行,前一个任务执行完,才会执行下一个任务。 为什么 JS 是单线程的语言? JS 是浏览器的脚本语言,主要用于实现和用户的交互。 前端主要使用 JS 实现对 DOM 的各种各样的操作,如果 JS 是多线程的语言, 那么一个线程 要对一个DOM节点 浏览器打开