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 学习笔记(十二) dom
Jan 21 Javascript
JS动态添加option和删除option(附实例代码)
Apr 01 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
JavaScript中的操作符==与===介绍
Dec 31 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
JS组件Bootstrap导航条使用方法详解
Apr 29 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
ionic2 tabs使用 Modal底部tab弹出框
Dec 30 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 Javascript
js实现抽奖的两种方法
Mar 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出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
2013/09/30 PHP
常用PHP封装分页工具类
2017/01/14 PHP
详解php协程知识点
2018/09/21 PHP
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
房地产项目策划书
2014/02/05 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
教师求职自荐信
2015/03/26 职场文书
监守自盗观后感
2015/06/10 职场文书
水浒传读书笔记
2015/06/25 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Python四款GUI图形界面库介绍
2022/06/05 Python