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 相关文章推荐
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
javascript模块化简单解析
Apr 07 Javascript
AngularJS 简单应用实例
Jul 28 Javascript
JavaScript中的冒泡排序法
Aug 03 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 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关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Python通过解析网页实现看报程序的方法
2014/08/04 Python
Python下的twisted框架入门指引
2015/04/15 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python调用C/C++的方法解析
2020/08/05 Python
python给list排序的简单方法
2020/12/10 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
如何在存储过程中使用Loop
2016/01/05 面试题
借款担保书范文
2014/05/13 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
离婚协议书怎么写
2015/01/26 职场文书
新闻通讯稿模板
2015/07/22 职场文书
会议室使用管理制度
2015/08/06 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python