写在前面:
1、本文默认读者对promise有所了解
2、本文不对promise方法做过多介绍
3、本文重点在于promise的思想以及自我实现。
回顾回调函数处理异步的弊端
1、嵌套形式回调导致代码易读性下降
2、回调函数模式处理当前与未来代码关系的信任问题
实际上,对于极其简单多个异步操作的封装和组合,回调函数处理也显得十分复杂。如
问题:现在有三个文件,file1,file2,file3, 需要实现这三个文件的并行读取,然后将并行读取的文件按照读取顺序输出,仅使用回调函数模式处理,该如何组织代码?
const files = ['file1.txt', 'file2.txt', 'file3.txt']
const read = require('fs').readFile
const response = {}
function outputFile(file){
read(file, function(err, text){
fileReceived(file, text)
})
}
function fileReceived(file, text){
if(!response[file]){
response[file] = text.toString()
}
for(let i = 0; i < files.length; i++){
if(files[i] in response){
if(response[files[i]] !== true){
console.log(response[files[i]])
response[files[i]] = true
}
}
}
}
outputFile('file1.txt')
outputFile('file2.txt')
outputFile('file3.txt')
异步并行是常见的一种异步形式。该问题的难点在于并行请求时间不确定时,使我们不得不使用额外的变量管理顺序输出。也由此可见,回调函数形式是异步的基础,但并不是优秀的解决方案。
Promise模式
Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数.
阮一峰 《ES6标准入门》
上面一段话的重点在于:
1、Promise时一个javascript语言定义的对象,该对象充当异步操作与回调函数的中介者。
2、Promise改变了异步操作的写法,提供了一些常用的异步处理方法,方便使用者组合使用。
Promise A+规范
参考链接:https://github.com/kaola-fed/blog/issues/99
下一篇文章介绍:Promise的实现