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 相关文章推荐
jquery获取iframe中的dom对象(两种方法)
Jul 02 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
May 24 Javascript
Vue filter 过滤器、以及在table中的使用介绍
Sep 07 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 Javascript
JavaScript的Set数据结构详解
Feb 18 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
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面向对象之多态
2014/08/20 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
使用k8s部署Django项目的方法步骤
2019/01/14 Python
django 环境变量配置过程详解
2019/08/06 Python
python之列表推导式的用法
2019/11/29 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
python中数字是否为可变类型
2020/07/08 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
小学毕业典礼演讲稿
2014/09/09 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
gojs实现蚂蚁线动画效果
2022/02/18 Javascript