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 相关文章推荐
JQuery扩展插件Validate 5添加自定义验证方法
Sep 05 Javascript
AngularJS基础学习笔记之表达式
May 10 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
js实现不提交表单获取单选按钮值的方法
Aug 21 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
javascript中setAttribute兼容性用法分析
Dec 12 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
详解用node搭建简单的静态资源管理器
Aug 09 Javascript
无限循环轮播图之运动框架(原生JS实现)
Oct 01 Javascript
vue 项目接口管理的实现
Jan 17 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
浅析VUE防抖与节流
Nov 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
php动态函数调用方法
2015/05/21 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python Django 命名空间模式的实现
2019/08/09 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
公交公司毕业生求职信
2014/02/15 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
刑事申诉状范文
2015/05/20 职场文书
离婚案件原告代理词
2015/05/23 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL