文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

改则止氨佣科技有限公司_更优雅的方式: JavaScript 中顺序执行异步函数

火于异步

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

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

ran hou, sui zhe Web ying yong bian de yue lai yue fu za , JavaScript de sheng tai he zhong yao xing ye ri yi ti sheng, YUI prototype. js jQuery deng ge zhong ku xiang ying deng chang, sui zhi er lai jiu dao le JavaScript de fan rong qi.

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://www.gaagur.com/ihb/58400-661338-46548.html

发布时间:07:39:39

八卦玄机网??490899.com??香港六开奖结果直播??彩坛至尊??全年历史图库445066??曾夫人论坛??马报一肖中特??877004.com??www.94770.com??马报开奖结果现场报码??

相关阅读 俄罗斯载人飞船发射后火箭故障 两名宇航员逃生返回地面618巅峰盛宴:京东、天猫百万商品大聚惠,爆款低至1折美墨边境部分大篷车移民开始“闯关” 十多人被捕面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)《绝地求生》全球邀请赛PGI2018即将开启 观赛指南出炉分析师:非农今晚亮相 欧元、日元、英镑最新技术分析中科院博士被币圈割光全部身家:所有虚拟币都是骗子徐先明:第一次,对“两中”工作的专项调查取得了良好的效果。

文章评论
发表评论

热门文章 满屏全是画!中国美院阅卷 考生作品铺满体育馆王德佳任辽宁锦州市委书记荣耀9i将于7月24日登陆印度:以荣耀9X之名金正恩特朗普签署“历史性”文件:朝方承诺完全无核化

最新文章 上市梦圆了,但拼多多的争议远没有结束AK-47制造商发布一款机器人,却成了俄罗斯网友的笑料 福布斯2018年名人财富榜:星球大战导演卢卡斯一世迈克尔乔丹四世中国电信广东送福利:佛山用户新关联微信可获1.5GB国内流量lol8.24版本排位赛系统改动详情:新增坚韧黑铁 傲世宗师湖南洪江一医院副院长违规操办女儿婚宴 147人被组织审查

人气排行 ES2018正则表达式更新“一带一路”法律交流与合作国际圆桌会议在京召开Redis详解(四)------ redis的底层数据结构智能网联汽车路测规范试行版发布:车辆应标示“自动驾驶测试”字样乐视网:选举刘淑青为公司第四届董事会董事长企业债券融资“内外暖内冷”宽频信用现金尚待办理新浪财经融资_____iPhone的价格又下降了!但许多国产手机的价格接近5000新浪财经。“情趣假日”:功夫更是在假期之外