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 style 中visibility和display之间的区别
Jan 22 Javascript
获取表单控件原始(初始)值的方法
Aug 21 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
Angularjs过滤器使用详解
May 25 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
Apr 11 jQuery
js实现股票实时刷新数据案例
May 14 Javascript
纯JavaScript实现实时反馈系统时间
Oct 26 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
Oct 12 Javascript
详解ES6系列之私有变量的实现
Nov 21 Javascript
深入解读VUE中的异步渲染的实现
Jun 19 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脚本的10个技巧(8)
2006/10/09 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
Prototype RegExp对象 学习
2009/07/19 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
Python数据操作方法封装类实例
2017/06/23 Python
Python中常用信号signal类型实例
2018/01/25 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
详解Python self 参数
2019/08/30 Python
python函数定义和调用过程详解
2020/02/09 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
农村文化活动总结
2014/08/28 职场文书
三峡大坝导游词
2015/01/31 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
交通事故协议书范本
2016/03/19 职场文书
应届毕业生的自我评价
2019/06/21 职场文书