NodeJS的Promise机制是为了解决JS执行过程中的异步问题,或者说,有时候我们希望程序代码是顺序执行的。
先来看看下面这段代码的执行结果:
var fs=require("fs");
var res = fs.readFile("C:/foo.txt",function(error,data){
console.log(data.toString())
});
console.log("end");
按照通常的理解,应该先打印出foo.txt文件中的内容,但实际的执行结果是先打印出了end字符串。这是因为JS代码的执行是异步的,但执行到读取文件这段代码时需要一些事件,于是并没有等待执行完毕就执行了下面的代码,因此打印出了end字符串。
如果我们想实现读完文件再执行打印end字符串的操作,就需要使用到Promise机制。看下面的代码:
function readFile_promise(path) {
return new Promise(function (resolve, reject) {
fs.readFile(path, "UTF-8", function (error, data) {
if (data) {
resolve(data);
} else {
reject(error);
}
});
});
}
var promise=readFile_promise("C:/foo.txt");
promise.then(function(data){
console.log(data);
}).then(function(){
console.log("end");
}).then(function(){
console.log("final");
});
我们声明了一个Promise函数,它有两个参数resolve代表执行成功,reject代表执行失败。调用的时候使用then方法,这样我们就实现了先读取文件再执行后续的打印操作(通过一个个then方法来拼接),进而达到了我们希望的串行调用。