叶扬皱了眉头想着这件事,他心中确实有些心动了。不管怎么样,这都是一条通往龙组高层的捷径,只有进入到龙组的高层之中后,他才能够前往龙域,去找孙艺维。

扎里克率领两百士兵在沙漠中向西行军,再向北走不远便出了沙漠,进入阿姆河畔的戈壁滩了,他们在冲上一座沙山后,忽然一名士兵指着前方喊道:“旅帅,你看那里”

比特币一天赚多少

只不过她收服这个凶兽可是用来战斗,所以可不敢下重手,不然的话弄残了就白费了。
“哦,那算了。”紫妍有点可惜不过却没放在心上,转身回去继续嗑药。

“那可不行,月之女神在的话,我可不能让任何人修理我,只有我修理别人,不然的话怎么保护我的月之女神啊。”刘皓说道。

更优雅的方式: JavaScript 中顺序执行异步函数


火于异步

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/

转载请注明出处: http://blog.givebest.cn/javascript/2018/04/05/javascript-sync.html

当前文章:http://hnhdqp.com/html_22389.html

发布时间:2018-10-15 09:57:49

如何轻松赚钱 在家做什么可以挣钱 上海兼职网赚日结工资 快乐赚游戏平台 2018网络偏门 什么软件可以挂机赚钱 点点赚pc版下载 全球赚钱手机游戏排行

编辑:杜成平成

相关新闻

沙莎一个陕南姑娘的陕北民歌情结

2018-10-15 05:51:44

阜新治市蓉集团公司

关于榆林市中级人民法院工作报告的决议

2018-10-15 14:50:21

葫芦岛蜗歉广告传媒有限公司

神东设备维修中心外圆滚光刀技术年节资15万元

2018-10-15 06:36:44

垦利纳蹬商贸有限公司

因女友和别人订婚小伙将其捅死 潜逃18年后终被抓

2018-10-15 16:58:56

改则盏掏文化传媒有限公司

热门推荐

  • 双重优惠立减140元,魅蓝Note6京东到手仅859元
  • 特朗普“双11”阅兵计划:展示历史服装 军机将唱主角
  • 青轴手感,Cherry樱桃JM-0300战帝电竞鼠标59元
  • 这款PowerLess插件可禁止苹果iOS设备的电源连接反馈
  • 爬虫性能分析
  • 又一款索尼新机现身GFXBench:6英寸巨屏+前置双摄
  • 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述
  • 辣品安卓版3.0登场!商品评论、辣度打分、收藏!
  • 乌克兰欲在黑海试射导弹 俄媒称这是在向俄宣战
  • 茂县救援现场发现两名罹难者 男子把女子护身下
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:有没有电脑赚钱的软件 挂机游戏赚钱是真的吗
  • 赚米钱包认证费 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 玩游戏赚钱人民币快 71团淘宝兼职599入会 时时彩网赚推广 opk全自动挂机网赚