JavaScript 异步调用


Posted in Javascript onOctober 25, 2017

问题

可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value

function aa() {
  setTimeout(function() {
    return "want-value";
  }, 1000);
}

但是,有额外要求:

aa() 函数可以随意修改,但是不能有 console.log()

执行 console.log() 语句里不能有 setTimeout 包裹

解答

也许这是个面试题,管它呢。问题的主要目的是考察对异步调用执行结果的处理,既然是异步调用,那么 不可能同步等待异步结果,结果一定是异步的

setTimeout() 经常用来模拟异步操作。最早,异步是通过回调来通知(调用)处理程序处理结果的

function aa(callback) {
  setTimeout(function() {
    if (typeof callback === "function") {
      callback("want-value");
    }
  }, 1000);
}
aa(function(v) {
  console.log(v);
});

不过回调在用于稍大型一点的异步应用时,容易出现多层嵌套,所以之后提出了一些对其进行“扁平”化,这一部分可以参考闲谈异步调用“扁平”化。当然 Promise 是非常流行的一种方法,并最终被 ES6 采纳。用Promise 实现如下:

function aa() {
  return new Promise(resolve => {
    setTimeout(function() {
      resolve("want-value");
    }, 1000);
  });
}
aa().then(v => console.log(v));

就这个例子来说,它和前面回调的例子大同小异。不过它会引出目前更推荐的一种方法——async/await,从 ES2017 开始支持:

function aa() {
  return new Promise(resolve => {
    setTimeout(function() {
      resolve("want-value");
    }, 1000);
  });
}
async function main() {
  const v = await aa();
  console.log(v);
}
main();

aa() 的定义与 Promise 方法中的定义是一样的,但是在调用的时候,使用了 await ,异步等待,等待到异步的结果之后,再使用 console.log() 对其进行处理。

这里需要注意的是 await 只能在 async 方法中使用,所以为了使用 await 必须定义一个 async 的 main 方法,并在全局作用域中调用。由于 main 方法是异步的(申明为 async),所以如果 main() 调用之后还有其它语句,比如 console.log("hello") ,那么这一句话会先执行。

async/await 语法让异步调用写起来像写同步代码,在编写代码的时候,可以避免逻辑跳跃,写起来会更轻松。(参考: 从地狱到天堂,Node 回调向 async/await 转变 )

当然,定义 main() 再调用 main() 这部分可以用 IIFE 封装一下,

(async () => {
  const v = await aa();
  console.log(v);
})();

总结

以上所述是小编给大家介绍的JavaScript 异步调用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
Mar 10 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 Javascript
跟我学习javascript的undefined与null
Nov 17 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
js原生跨域_用script标签的简单实现
Sep 24 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
es6学习笔记之Async函数基本教程
May 11 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
JS如何判断对象是否包含某个属性
Aug 29 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
parabola.js抛物线与加入购物车效果的示例代码
Oct 25 #Javascript
通过js控制时间,一秒一秒自己动的实例
Oct 25 #Javascript
js 显示日期时间的实例(时间过一秒加1)
Oct 25 #Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
Oct 25 #Javascript
BootStrap 标题设置跨行无效的解决方法
Oct 25 #Javascript
vue基于mint-ui的城市选择3级联动的示例
Oct 25 #Javascript
浅谈Vue的加载顺序探讨
Oct 25 #Javascript
You might like
收音机指标测试方法及仪器
2021/03/01 无线电
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python实现截屏的函数
2015/07/25 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
python递归全排列实现方法
2018/08/18 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
简单了解python协程的相关知识
2019/08/31 Python
Django视图扩展类知识点详解
2019/10/25 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
空乘英文求职信
2014/04/13 职场文书
政风行风整改方案
2014/10/25 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
倡议书怎么写?
2019/04/11 职场文书
Python学习之迭代器详解
2022/04/01 Python
tree shaking对打包体积优化及作用
2022/07/07 Java/Android