博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node 异步编程
阅读量:6096 次
发布时间:2019-06-20

本文共 3863 字,大约阅读时间需要 12 分钟。

异步编程包含以下几种形式:

  1. callback function
  2. promise
  3. generator function (co)
  4. async await function

callback function

嵌套太深,看起来太费劲。(不推荐使用。)

function async1(fn) {	setTimeout(function(){		fn('hello');	},1)}function async2(fn) {	setTimeout(function(){		fn('world');	},1);	}async1(function(data){	async2(function(data1){		console.log(data + ',' + data1);	})})复制代码

promise

  • 可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
  • Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
  • pending ——>resolved——>rejected
  • new Promise(function(resolve, reject){}); // reject 可选参数
  • promise.all
  • promise.race
function promise1() {    return new Promise((resole, reject) => {        setTimeout(() => {            resole("Hello"); //[@4](/user/4) 返回正确结果        }, 1)    })}function promise2(data1) {    return new Promise((resole, reject) => {        setTimeout(() => {            resole(data1 + " world");        }, 1)    }, 1)}promise1()        .then(function (v) {            return promise2(v)        })        .then(function (data2) {            console.log(data2)        })        .catch(function (e) {            console.log(e)        });复制代码

promise.all

合并请求

function timeout(duration) {    return new Promise((resolve, reject) => {        setTimeout(function(){        	resolve('hello world');        }, duration);    });}var p = timeout(200).then(() => {    return Promise.all([timeout(100), timeout(200)]);})p.then(v => {	console.log(v)})复制代码

promise.race

当有一个请求返回时,返回最新值。

var p1 = new Promise(function(resolve, reject) {    setTimeout(resolve, 0, 'success');});var p2 = new Promise(function(resolve, reject) { });var p2 = new Promise(function(resolve, reject) { });var race = Promise.race( [p1, p2, p3] );race.then(function(result) {    console.log(result);});// Output:// successvar race = Promise.race( [Promise.reject('failure'),    Promise.resolve('success')] );race.catch(function(result) {    console.log(result);});// Output:// failure复制代码

generator function

es6 的函数生成器 // 最大特点就是可以交出函数的执行权(即暂停执行),配合yield 关键字使用。

function* fibonacci() {    yield 1;    yield 2;}var it = fibonacci();console.log(it);          // "Generator {  }"console.log(it.next());   // 1console.log(it.next());   // 2console.log(it.next()); //undefined复制代码
function* foo() {    yield 0;    yield 1;}function* bar() {    yield 'x';    yield* foo();    yield 'y';}for (let v of bar()){    console.log(v);};复制代码

// 输出结果:x, 0, 1, y

co (TJ)

实现原理封装了promise

var co = require('co');co(function *(){  // yield any promise  var result = yield Promise.resolve(true);}).catch(onerror);co(function *(){  // resolve multiple promises in parallel  var a = Promise.resolve(1);  var b = Promise.resolve(2);  var c = Promise.resolve(3);  var res = yield [a, b, c];  console.log(res);  // => [1, 2, 3]}).catch(onerror);// errors can be try/catchedco(function *(){  try {    yield Promise.reject(new Error('boom'));  } catch (err) {    console.error(err.message); // "boom" }}).catch(onerror);function onerror(err) {  // log any uncaught errors  // co will not throw any errors you do not handle!!!  // HANDLE ALL YOUR ERRORS!!!  console.error(err.stack);}复制代码

终极解决方案 async / await

  • async/await是写异步代码的新方式,以前的方法有回调函数和Promise。
  • async/await是基于Promise实现的,它不能用于普通的回调函数。
  • async/await与Promise一样,是非阻塞的。
  • async/await使得异步代码看起来像同步代码。
  • 节约代码。
  • async/await try/catch可以同时处理同步和异步错误
const f = async() => {	return 'hello world';};const testAsync = async () => {	try {	    const t = await f();	    console.log(t);		const s = await s();	} catch(e) {		console.log(e);	}};testAsync();复制代码

同上,一样的效果

const f = () => {    return new Promise((resole, reject) => {        return 'hello world';    })}const testAsync = async () => {	try {	    const t = await f();	    console.log(t);		const s = await s();	} catch(e) {		console.log(e);	}};testAsync();复制代码

说明async 原理也是对promise进行了封装。

转载地址:http://tbzza.baihongyu.com/

你可能感兴趣的文章
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>
醋泡大蒜有什么功效
查看>>
hdu 5115(2014北京—dp)
查看>>
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)...
查看>>
PHP读取日志里数据方法理解
查看>>
第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
查看>>
Vivado增量式编译
查看>>
一个很好的幻灯片效果的jquery插件--kinMaxShow
查看>>
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>