javascript的异步编程解决方案收集
缘起
没理解js异步的同学看下面的例子:
for (var i = 0; i < 5; i++) {
  //模拟一个异步操作
  setTimeout(() => {
    console.log(i);
  }, 1000);
}
我们想要的结果是:0,1,2,3,4
结果却出乎意料:5,5,5,5,5
分析
js的特点就是单线程异步非堵塞。需要好好理解这句话:js对于异步操作,不会停下来等待上一个异步操作完成,才进行下一个异步操作。
如果要达到顺序执行,只能用回调:也就是上一个异步操作完成时,再调用下一个异步操作。
要是如上面的循环,要如何操作呢?
解决方法1
通过调用自身解决循环的回调嵌套问题
function sync(i) {
  setTimeout(() => {
    if (i < 5){
      console.log(i);
      i++;
      sync(i);
    }
  }, 1000);
}
sync(0)
解决方法2
使用await/async
优点:直观,符合同步编程思维。其实本质还是异步回调
缺点:大部分浏览器下载还不支持。需要配合Promise使用,需要写成两个函数
服务器端node.js支持。以下代码在最新版chrome浏览器中可以运行:
const f = (i) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(i);
    }, 1000);
  });
};
const testAsync = async () => {
  for (var i = 0; i < 5; i++) {
    const t = await f(i);
    console.log(t);
  }
};
testAsync();
解决方法3
使用co库
function* useco(){
  for(var i=0; i<5; i++){
    yield new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(i);
          console.log(i);
        }, 1000);
    });
  }
}
co(useco);
依赖于上一个异步操作的结果,进行下一个异步操作:
function* useco() {
  var x=0;
  for (var i = 0; i < 5; i++) {
    x= yield new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(x+i);
      }, 1000);
    });
    console.log(x);
  }
}
co还是很强大的。
解决方法4
等待补充...
javascript的异步编程解决方案收集的更多相关文章
- javascript的异步编程
		
同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...
 - node.js异步编程解决方案之Promise用法
		
node.js异步编程解决方案之Promise var dbBase = require('../db/db_base'); var school_info_db = require('../db/s ...
 - Promise异步编程解决方案
		
Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...
 - JavaScript异步编程解决方案探究
		
javascript的天生单线程特性,使得异步编程对它异常重要,早期的通常做法是用回调函数来解决.但是随着逻辑的复杂,和javascript在服务端的大显神通,使得我们很容易就陷入“回调陷井”的万丈深 ...
 - Func-Chain.js 另一种思路的javascript异步编程解决方案
		
本文转载自:https://www.ctolib.com/panruiplay-func-chain.html Func-Chain.js 另一种思路的javascript异步编程,用于解决老式的回调 ...
 - JavaScript中异步编程
		
一 关于事件的异步 事件是JavaScript中最重要的一个特征,nodejs就是利用js这一异步而设计出来的.所以这里讲一下事件机制. 在一个js文件中,如果要运行某一个函数,有2中手段,一个就是直 ...
 - 说一说javascript的异步编程
		
众所周知javascript是单线程的,它的设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 所谓的单线程就是一次只能完成一个任务, ...
 - javascript的异步编程方法
		
一,callback 回调函数 即函数f1和函数f2的关系是f1(f2()); f2作为f1()的回调函数,在f1执行过程中就开始执行f2,先执行线程的主要逻辑,将比较耗时的任务放在后面执行. 回调函 ...
 - nodejs学习笔记 —— 异步编程解决方案
		
在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听 ...
 
随机推荐
- How to resize or create a thumbnail image from file stream on UWP
			
最近在搞Ocr相关的windows universal app, 用到了一些图像处理相关的知识. 涉及到了BitmapDecoder/BitmapEncoder/IRandomAccessStream ...
 - (转)浅谈AIX下IPFilter防火墙
			
1 序言 AIX操作系统发行至今,经历数个版本,功能不断增强,就安全方面IP Security也变化不少,如动作中增加了If等功能,但这次暂且讨论配置防火墙策略及防火墙的基本操作,其他高级功能待 ...
 - C++ 操作符、局部 全局变量及自动转换原则
			
1.&:表示与操作,eg:2&1=2&&:表示and操作,eg:1&&0=0|:表示或操作,eg:2|1=3||:表示or操作,eg:1||0=12.全 ...
 - spring mvc 数据格式化
			
web.xml <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www. ...
 - android app性能优化大汇总(google官方Android性能优化典范 - 第3季)
			
(1)Fun with ArrayMaps 程序内存的管理是否合理高效对应用的性能有着很大的影响,有的时候对容器的使用不当也会导致内存管理效率低下.Android为移动操作系统特意编写了一些更加高效的 ...
 - 摆脱定时任务的cron表达式的困扰
			
一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...
 - pipelinedb--流、滑动窗口测试
			
https://blog.csdn.net/liuxiangke0210/article/details/74010951 https://yq.aliyun.com/articles/166 一.p ...
 - little eye 精简版
			
https://github.com/salomon1184/PerfMan/ 代码没整理,特乱 来源于一次聊天,一天半做完,考虑继续深做
 - ELK常用命令
			
1.查询当前所有的索引 #curl 'localhost:9200/_cat/indices?v' 2.查看集群健康状态 #curl 'localhost:9200/_cat/health?v' 绿色 ...
 - (转)mysql升级5.5.20时遇到的问题:1548-Cannot load from mysql.proc. The table is probably corrupted
			
LINUX下将mysql从5.1升级至5.5后,发现存储过程不能用了.创建和使用存储过程时就会提示Cannot load from mysql.proc. The table is probably ...