缘起

没理解js异步的同学看下面的例子:

  1. for (var i = 0; i < 5; i++) {
      //模拟一个异步操作
  2. setTimeout(() => {
  3. console.log(i);
  4. }, 1000);
  5. }

我们想要的结果是:0,1,2,3,4

结果却出乎意料:5,5,5,5,5

分析

js的特点就是单线程异步非堵塞。需要好好理解这句话:js对于异步操作,不会停下来等待上一个异步操作完成,才进行下一个异步操作。

如果要达到顺序执行,只能用回调:也就是上一个异步操作完成时,再调用下一个异步操作。

要是如上面的循环,要如何操作呢?

解决方法1

通过调用自身解决循环的回调嵌套问题

  1. function sync(i) {
  2. setTimeout(() => {
  3. if (i < 5){
  4. console.log(i);
  5. i++;
  6. sync(i);
  7. }
  8. }, 1000);
  9. }
  10.  
  11. sync(0)

解决方法2

使用await/async

优点:直观,符合同步编程思维。其实本质还是异步回调

缺点:大部分浏览器下载还不支持。需要配合Promise使用,需要写成两个函数

服务器端node.js支持。以下代码在最新版chrome浏览器中可以运行:

  1. const f = (i) => {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. resolve(i);
  5. }, 1000);
  6. });
  7. };
  8.  
  9. const testAsync = async () => {
  10. for (var i = 0; i < 5; i++) {
  11. const t = await f(i);
  12. console.log(t);
  13. }
  14. };
  15.  
  16. testAsync();

解决方法3

使用co

  1. function* useco(){
  2. for(var i=0; i<5; i++){
  3. yield new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. resolve(i);
  6. console.log(i);
  7. }, 1000);
  8. });
  9. }
  10. }
  11.  
  12. co(useco);

依赖于上一个异步操作的结果,进行下一个异步操作:

  1. function* useco() {
  2. var x=0;
  3. for (var i = 0; i < 5; i++) {
  4. x= yield new Promise((resolve, reject) => {
  5. setTimeout(() => {
  6. resolve(x+i);
  7. }, 1000);
  8. });
  9. console.log(x);
  10. }
  11. }
co(useco).then(() => {
   console.log('执行完毕');
})
  1.  

co还是很强大的。

解决方法4

等待补充...

javascript的异步编程解决方案收集的更多相关文章

  1. javascript的异步编程

    同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...

  2. node.js异步编程解决方案之Promise用法

    node.js异步编程解决方案之Promise var dbBase = require('../db/db_base'); var school_info_db = require('../db/s ...

  3. Promise异步编程解决方案

    Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...

  4. JavaScript异步编程解决方案探究

    javascript的天生单线程特性,使得异步编程对它异常重要,早期的通常做法是用回调函数来解决.但是随着逻辑的复杂,和javascript在服务端的大显神通,使得我们很容易就陷入“回调陷井”的万丈深 ...

  5. Func-Chain.js 另一种思路的javascript异步编程解决方案

    本文转载自:https://www.ctolib.com/panruiplay-func-chain.html Func-Chain.js 另一种思路的javascript异步编程,用于解决老式的回调 ...

  6. JavaScript中异步编程

    一 关于事件的异步 事件是JavaScript中最重要的一个特征,nodejs就是利用js这一异步而设计出来的.所以这里讲一下事件机制. 在一个js文件中,如果要运行某一个函数,有2中手段,一个就是直 ...

  7. 说一说javascript的异步编程

    众所周知javascript是单线程的,它的设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 所谓的单线程就是一次只能完成一个任务, ...

  8. javascript的异步编程方法

    一,callback 回调函数 即函数f1和函数f2的关系是f1(f2()); f2作为f1()的回调函数,在f1执行过程中就开始执行f2,先执行线程的主要逻辑,将比较耗时的任务放在后面执行. 回调函 ...

  9. nodejs学习笔记 —— 异步编程解决方案

    在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听 ...

随机推荐

  1. Zookeeper--0200--安装与集群搭建、常用命令、客户端工具

    看这里,http://www.cnblogs.com/lihaoyang/p/8358153.html 1,先使用可视化客户端软件 ZooInspector 连接上集群中的一个节点,看下zk的结构: ...

  2. Spring Security和JWT实现登录授权认证

     目标 1.Token鉴权 2.Restful API 3.Spring Security+JWT 开始 自行新建Spring Boot工程 引入相关依赖 <dependency> < ...

  3. java学习碰到死胡同了

    一个月前看了java的异常处理,有点凌乱,各种异常好不习惯,特别是那个throws和throw,现在好多了,编程中使用打异常抛出没啥问题了,只是线程和输出输入流又遇到问题了,线程刚学,了解了Threa ...

  4. WM_COMMAND和WM_NOTIFY区别[转]

    对这几个消息的理解要先了解一下Window消息的背景.          在Windows3.1里,控件会将mouse,   keybord等等的消息通知它的父窗口,   使用的消息就只有WM_COM ...

  5. 并发编程之 Java 三把锁

    前言 今天我们继续学习并发.在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性.其中,synchronized 高频出现,因为他既保证了原 ...

  6. ASP.NET MVC呼叫WCF Service的方法

    本演示,Insus.NET操练asp.net mvc的应用程序,虽然以前有写过:<MVC应用程序使用Wcf Service>http://www.cnblogs.com/insus/p/3 ...

  7. MVC应用程序实现上传文件(续)

    前几天,有练习了<MVC应用程序实现上传文件>http://www.cnblogs.com/insus/p/3590907.html 那只是把文档上传至MVC应用程序下的某一目录之中. 其 ...

  8. MongoDB中空间数据的存储和操作

    本文使用官方C# Driver,实现在MongoDB中存储,查询空间数据(矢量) 空间数据的存储 本例中,从一个矢量文件(shapefile格式)中读取矢量要素空间信息以及属性表,并写入到MongoD ...

  9. RESTful API入门

      RESTful是一种设计风格,并不是一种标准. 简短的去概括的话,就是:1.URL 定位资源 资源,就是数据.比如newsfeed,friends,order等 2.用 HTTP 动词描述操作. ...

  10. Oracle简介及安装

    一.轨迹 二.Oracle简介 Oracle是现在全世界最大的数据库提供商,编程语言提供商,应用软件提供商,它的地位等价于微软的地位. Oracle在古希腊神话中被称为“神谕”,指的是上帝的宠儿,在中 ...