前言
JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面。
但异步有时候很方便,有时候却很让人恼火,下面来总结一下异步执行结果获取的方法
回调
这是最传统的方法了,也是最简单的,如下代码
function foo(cb) { setTimeout(function() { cb(1); // 通过参数把结果返回 }, 2000); } foo(function(result) { // 调用foo方法的时候,通过回调把方法返回的数据取出来 console.log(result); })
Promise
Promise是ES6里加入的新对象,它可以把一个异步执行的方法封装成支持同步操作的方法,结合 async/await 完美,下面说一下它是怎么封装一个方法的
function foo() { return new Promise((resolve, reject) => { setTimeout(function() { resolve(1); // 通过 resolve 参数把成功的结果返回 // reject('error'); // 通过 reject 参数把错误信息返回 }, 2000); }) } // 调用 foo() .then(result => console.log(result)) .catch(error => console.log(error));
从上面例子可以看出,Promise取值使用的是 .then() 函数,异常处理用的是 .catch() 函数
rxjs
rxjs 是一种设计思想的javascript语言的实现框架,rx原名是:ReactiveX
官网是 http://reactivex.io/
开源地址 https://github.com/ReactiveX/rxjs
rx口号是万物皆是流,跟java里万物皆对象挺像的,它的api也全都是对流进行操作,写起来还是很爽的,下面看一下rxjs怎么封装一个异步执行操作
注意,用这货首先要安装它在自己的项目里,然后再引入依赖,如果是浏览器环境可以引入js
import { Observable } from 'rxjs'; function foo() { return new Observable((observe) => { setTimeout(function() { observe.next(1); // 通过 observe.next() 方法把成功的结果返回 // observe.error('error'); // 通过 observe.error 方法把错误信息返回 }, 2000); }) } // 调用 foo() .subscribe( result => console.log(result), error => console.log(error) );
可以看到它跟Promise很像,就是变了几个参数名,不过它可比Promise强大多了
下面来说一下rxjs里的取消操作,没错请求还能取消,这骚操作也只有rxjs能实现了
import { Observable } from 'rxjs'; function foo() { return new Observable((observe) => { setTimeout(function() { observe.next(1); // 通过 observe.next() 方法把成功的结果返回 // observe.error('error'); // 通过 observe.error 方法把错误信息返回 }, 2000); }) } // 调用,方法里2s后返回数据 const o = foo().subscribe( result => console.log(result), error => console.log(error) ); // 设置一个定时器1s后取消订阅,这样console里就不会打印出结果了,这个请求也就被取消了 setTimeout(function() { o.unsubscribe(); // 取消订阅 }, 1000);
rxjs除了取消执行外,还有一个牛逼的功能,循环执行,对一个请求可以一直接收它返回的结果,看下下面的例子就明白了
import { Observable } from 'rxjs'; function foo() { return new Observable((observe) => { let count = 0; setInterval(function() { observe.next(count++); // 通过 observe.next() 方法把成功的结果返回 // observe.error('error'); // 通过 observe.error 方法把错误信息返回 }, 1000); }) } // 调用 foo().subscribe( result => console.log(result), // 这行会每隔1s打印一条数据 error => console.log(error) );
因为在 ReactiveX 里一切皆是流,所以也就有很多对流操作的api,比如 fliter, map 等,类似于java8里的 stream 的操作,下面看一下例子说明白了
import { Observable } from 'rxjs'; // 对流操作要引入操作类 import { map, filter } from 'rxjs/operators'; function foo() { return new Observable((observe) => { let count = 0; setInterval(function() { observe.next(count++); // 通过 observe.next() 方法把成功的结果返回 // observe.error('error'); // 通过 observe.error 方法把错误信息返回 }, 1000); }) } // 调用 const o = foo(); o.pipe( filter((value: number) => value % 2 === 0), map((value: number) => value *= 2) ).subscribe(data => console.log(data));
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
如何使用setState在更新后正确获取结果状态。下面是我从中得到的代码示例,它与我的代码类似,为什么在异步函数中不更新react hook值。但仍然没有解决这个问题的办法。很多帮助都会有帮助。非常感谢。
本文向大家介绍PHP ajax 异步执行不等待执行结果的处理方法,包括了PHP ajax 异步执行不等待执行结果的处理方法的使用技巧和注意事项,需要的朋友参考一下 短地址生成应用中,要根据长地址生成网页快照,这个生成时间非瞬发,不可预估。 所以前台方面采用的方案一般为先展示生成的短地址,再定期AJAX轮查网页快照是否生成完毕。 So,PHP代码这里做了如下处理: 前台Js的ajax脚本: 回调函数
本文向大家介绍Javascript异步执行不按顺序解决方案,包括了Javascript异步执行不按顺序解决方案的使用技巧和注意事项,需要的朋友参考一下 案例分析: 比如执行懒加载时候,onscroll 事件触发多次事件时候会调用多次 ajax 回调事件,由于每个事件返回先后次序并不能保证和触发前一致,所以在数据响应返回后所添加的数据顺序就很在 push 到数组上顺序不一致。 例子1: 这里的并发“
本文向大家介绍浅谈js的异步执行,包括了浅谈js的异步执行的使用技巧和注意事项,需要的朋友参考一下 1.Javascript语言的执行环境是”单线程”(single thread): 优点:实现起来比较简单,执行环境相对单纯; 缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环)
控制器中获取模板执行结果方法为:fetch() 而将内容输出方法为:display() 代码如下,获取模板执行结果: $content=$this->fetch('Blog.show');
本文向大家介绍同步异步动态引入js文件的几种方法总结,包括了同步异步动态引入js文件的几种方法总结的使用技巧和注意事项,需要的朋友参考一下 动态加载js文件 有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 二.异步加载,并发执行,但引入js内容不能直接使用 三.同步加载,单步加载,引入js内容可以直接使