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 相关文章推荐
JS动画效果代码3
Apr 03 Javascript
js 全兼容可高亮二级缓冲折叠菜单
Jun 04 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
Dec 05 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
JS运动特效之链式运动分析
Jan 24 Javascript
微信小程序项目实践之主页tab选项实现
Jul 18 Javascript
微信小程序实现顶部下拉菜单栏
Nov 04 Javascript
微信小程序自定义导航栏
Dec 31 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
微信小程序如何利用getCurrentPages进行页面传值
Jul 01 Javascript
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页面间传递参数实例代码
2008/06/05 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Python数据类型之Dict字典实例详解
2019/05/07 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
python3让print输出不换行的方法
2020/08/24 Python
Python下载的11种姿势(小结)
2020/11/18 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
上海方立数码笔试题
2013/10/18 面试题
如何写毕业求职自荐信
2013/11/06 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
活动策划求职信模板
2014/04/21 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
植树节新闻稿
2015/07/17 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
如何用PHP实现多线程编程
2021/05/26 PHP
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js