问题:
当有多个回调函数后,就无法保证其输出的顺序性了,而采用嵌套的方式虽可以解决这个问题,但是代码样式太丑,且很乱,Promise的出现就是为了解决这个问题
多个回调函数
var fs = require('fs');fs.readFile('./files/1.txt','utf8',function(err,data){if(err){throw err;}console.log(data);})fs.readFile('./files/2.txt','utf8',function(err,data){if(err){throw err;}console.log(data);})fs.readFile('./files/3.txt','utf8',function(err,data){if(err){throw err;}console.log(data);})
嵌套
fs.readFile('./files/1.txt','utf8',function(err,data){if(err){throw err;}console.log(data);//读取第二个异步任务fs.readFile('./files/2.txt','utf8',function(err,data){console.log(data);//读取第三个异步任务fs.readFile('./files/3.txt','utf8',function(err,data){console.log(data);})})
})
起步
在 new Promise()容器放入回调函数
//语法:new Promise(function(callback){})
var fs = require('fs');
var promise = new Promise(function(resolve,reject){//两个参数 resolve 异步执行成功的回调函数,reject异步执行失败的回调函数fs.readFile('./files/1.txt', 'utf8', function (err, data) {if (err) {throw err;}console.log(data);})
});
基本使用
在 new Promise()容器放入回调函数后,通过resolve将参数里的值带出来
then里面的参数data就是resolve()括号里的值
(简化起见,不写err)
var fs = require('fs');
var promise = new Promise(function (resolve) {fs.readFile('./files/1.txt', 'utf8', function (err, data) {resolve(data);})
});promise.then(function (data) {console.log('成功:' + data);
});
封装
一层封装
var fs = require('fs');function getFile(path){
return new Promise(function (resolve) {fs.readFile(path, 'utf8', function (err, data) {resolve(data);})
});
}getFile('./files/1.txt').then(function (data) {console.log('成功:' + data)
})
对于代码重复的回调函数可以链式使用.then封装,如下
var fs = require('fs');function getFile(path){
return new Promise(function (resolve) {fs.readFile(path, 'utf8', function (err, data) {resolve(data);})
});
}getFile('./files/1.txt')
.then(function (data) {console.log('====>' + data)return getFile('./files/2.txt')
})
.then(function(data){console.log('====>' + data)return getFile('./files/3.txt')
})
.then(function(data){console.log('====>' + data)
})
执行多次异步操作
var promise1 = getFileByPath('./files/1.txt');
var promise2 = getFileByPath('./files/2.txt');
var promise3 = getFileByPath('./files/3.txt');Promise.all([promise3,promise1,promise2]).then(function(data){console.log(data);
},function(err){console.log(err);
})