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 appendChild,innerHTML,join性能比较代码
Aug 29 Javascript
Javascript 面向对象 重载
May 13 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
js获取url中"?"后面的字串方法
May 15 Javascript
分析了一下JQuery中的extend方法实现原理
Feb 27 Javascript
微信小程序 swiper组件轮播图详解及实例
Nov 16 Javascript
JavaScript中定义对象原型的两种使用方法
Dec 15 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
鸿蒙系统中的 JS 开发框架
Sep 18 Javascript
vue实现同时设置多个倒计时
May 20 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设计模式 php实现工厂模式(factory)
2015/12/07 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
js闭包实例汇总
2014/11/09 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
浅谈js的异步执行
2016/10/18 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
python with statement 进行文件操作指南
2014/08/22 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
学期自我鉴定范文
2013/10/01 职场文书
植树节标语
2014/06/27 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
精神病医院见习报告
2014/11/03 职场文书
学校会议通知范文
2015/04/15 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js