异步流程控制(Callback 、Promise、Generator + co、async + await)

本文详细介绍了异步编程的不同解决方案,包括Callback函数及其导致的回调地狱问题,Promise作为解决回调地狱的方式,Generator函数的使用,以及Node.js 8以上版本引入的async/await语法糖,它们如何简化异步控制流,并对比了Generator + co与async/await的差异。
摘要由CSDN通过智能技术生成
一. Callback (回调函数)

1.定义:把函数当作变量传到另一个函数里,传进去之后执行甚至返回等待之后的执行。

2.一个简单的例子

function add_callback(p1, p2 ,callback) {
   
var my_number = p1 + p2;
callback(my_number);
}
add_callback(5, 15, function(num){
   
console.log("call " + num);
});

3 error first
1).回调函数的第一个参数保留给一个错误error对象,如果有错误发生,错误将通过第一个参数err返回。
2).回调函数的第二个参数为成功响应的数据保留,如果没有错误发生,err将被设置为null, 成功的数据将从第二个参数返回。

4.callback hell
JavaScript 是由事件驱动的异步编程,一个异步的操作,我们在调用他的时候,不会马上得到结果,而是会继续执行后面的代码。这样,如果我们需要在查到结果之后才做某些事情的话,就需要把相关的代码写在回调里面,如果涉及到多个这样的异步操作,就势必会陷入到回调地狱中去。eg:

fs.readdir(source, function (err, files) {
   
if (err) {
   
console.log('Error finding files: ' + err)
} else {
   
files.forEach(function (filename, fileIndex) {
   
console.log(filename)
gm(source + filename).size(function (err, values) {
   
if (err) {
   
console.log('Error identifying file size: ' + err)
} else {
   
console.log(filename + ' : ' + values)
aspect = (values.width / values.height)
widths.forEach(function (width, widthIndex) {
   
height = Math.round(width / aspect)
console.log('resizing ' + filename + 'to ' + height + 'x' + height)
this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
   
if (err) console.log('Error writing file: ' + err)
})
}.bind(this))
}
})
})
}
})
二. Promise(为了解决callback hell的问题)

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。
1. Promise A+规范:
Promise 规范有很多,如 Promise/A,Promise/B,Promise/D 以及 Promise/A 的升级版 Promise/A+,最终 ES6 中采用了 Promise/A+ 规范。Promise/A+ 官网:https://promisesaplus.com/

2.promise对象的特点
1.对象的状态不受外界影响,promise对象代表一个异步操作,有三种状态,pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态,这也是promise这个名字的由来“承诺”;
2.一旦状态改变就不会再变,任何时候都可以得到这个结果,promise对象的状态改变,只有两种可能:从pending变为fulfilled,从pending变为rejected。这时就称为resolved(已定型)。如果改变已经发生了,你再对promise对象添加回调函数,也会立即得到这个结果,这与事件(event)完全不同,事件的特点是:如果你错过了它,再去监听是得不到结果的。

3. 创造了一个Promise实例

var promise = new Promise( function( resolve, reject) {
   
/some code
if(//异步操作成功){
   
resolve(value);
}else{
   
reject(error);
}
});

4.Promise 方法:

Promise.prototype.then = function() {
   }
Promise.prototype.catch = function() {
   }
Promise.resolve = function() {
   }
Promise.reject = function() {
   }
Promise.all = function() {
   }
Promise.race = function() {
   }

1).promise.then方法返回promise的结果,then 的第一个参数是处理正确时的返回值的函数,第二个参数是处理错误时的返回的error的函数

promise.then(function(value) {
   
// success
}, function(error) {
   
// failure
});

2).promise.catch可以捕获promise返回的错误

var promise = new Promise(function(resolve, reject) {
   
throw new Error('test');
});
promise.catch(function(error) {
   
console.log(error);
});

3).Promise.resolve 是将一个值包裹成 promi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值