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系列之数据类型 字符串
Jun 08 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
Nov 01 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
发布订阅模式在vue中的实际运用实例详解
Jun 09 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基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
jQuery Mobile 导航栏代码
2013/11/01 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
搭建vue开发环境
2018/07/19 Javascript
js实现简单的秒表
2020/01/16 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python实现简单加密解密机制
2019/03/19 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python实现密码强度校验
2020/03/18 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
解决python运行效率不高的问题
2020/07/20 Python
python把一个字符串切开的实例方法
2020/09/27 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
师范生教师实习自我鉴定
2013/09/27 职场文书
新闻学专业应届生求职信
2013/11/08 职场文书
初中生学习的自我评价
2013/11/14 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
工作推荐信范文
2014/05/10 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
计划生育汇报材料
2014/12/26 职场文书
晚会开场白和结束语
2015/05/29 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
外出考察学习心得体会
2016/01/18 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
php png失真的原因及解决办法
2021/10/24 PHP
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技