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 相关文章推荐
Javascript基础教程之argument 详解
Jan 18 Javascript
js实现Select下拉框具有输入功能的方法
Feb 06 Javascript
javascript制作sql转换为stringBuffer的小工具
Apr 03 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
JavaScript之解构赋值的理解
Jan 30 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
vant IndexBar实现的城市列表的示例代码
Nov 20 Javascript
jquery绑定事件 bind和on的用法与区别分析
May 22 jQuery
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
使用php+xslt在windows平台上
2006/10/09 PHP
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php cookie的操作实现代码(登录)
2010/12/29 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
jquery原理以及学习技巧介绍
2015/11/11 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python通过select实现异步IO的方法
2015/06/04 Python
python-opencv颜色提取分割方法
2018/12/08 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
pandas分批读取大数据集教程
2020/06/06 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
青年教师培训方案
2014/02/06 职场文书
事业单位鉴定材料
2014/05/25 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书