問題:
當有多個回調函數後,就無法保證其輸出的順序性了,而採用嵌套的方式雖可以解決這個問題,但是代碼樣式太醜,且很亂,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);
})