您基本上需要執行打印console.log的下一個函數。基本上這樣:
function createDir(){
fs.mkdirs('./quickstart',function(){
console.log("thao thanh cong");
unZip(); // CALL UNZIP WHEN WE ARE FINISHED
});
}
function unZip(){
var zipfile = fs.createReadStream('./prestashop_cache/' + quickstart);
zipfile.pipe(unzip.Extract({path:'./quickstart'}));
zipfile.on('end',function(){
console.log("giai nen xong");
copydata(); // CALL COPYDATA WHEN WE ARE FINISHED
});
}
function copydata(){
if (path.extname(folder + '/samples' + version + '/data') != '.DS_Store' && path.extname(folder + '/samples' + version + '/data') != '.svn' && path.extname(folder + '/samples' + version + '/data') != '__MACOSX') {
fs.copy(folder + '/samples' + version + '/data','./quickstart/prestashop/install/data/', function() {
console.log("coppy thanh cong toi thu muc data");
});
}
}
但是這不是很模塊化嗎?它在函數之間創建了太多的依賴關係,所以你不能重用它們中的任何一個。沒問題! JavaScript中允許你身邊函數作爲參數傳遞:
function createDir(callback){
fs.mkdirs('./quickstart',function(){
console.log("thao thanh cong");
if (callback) {
callback(); // Call a function when finished
}
});
}
function unZip(callback){
var zipfile = fs.createReadStream('./prestashop_cache/' + quickstart);
zipfile.pipe(unzip.Extract({path:'./quickstart'}));
zipfile.on('end',function(){
console.log("giai nen xong");
if (callback) {
callback(); // Call a function when finished
}
});
}
function copydata(callback){
if (path.extname(folder + '/samples' + version + '/data') != '.DS_Store' && path.extname(folder + '/samples' + version + '/data') != '.svn' && path.extname(folder + '/samples' + version + '/data') != '__MACOSX') {
fs.copy(folder + '/samples' + version + '/data','./quickstart/prestashop/install/data/', function() {
console.log("coppy thanh cong toi thu muc data");
if (callback) {
callback(); // Call a function when finished
}
});
}
}
所以現在你可以打電話給他們這樣的:你可以用Node.js的承諾的新版本或者
createDir(function(){
unZip(function(){
copydata()
});
});
。它基本上做同樣的事情,但與可鏈接的語法:
function createDir(){
return new Promise(function(callback,error_callback){
fs.mkdirs('./quickstart',function(){
console.log("thao thanh cong");
callback();
});
});
}
function unZip(){
return new Promise(function(callback,error_callback){
var zipfile = fs.createReadStream('./prestashop_cache/' + quickstart);
zipfile.pipe(unzip.Extract({path:'./quickstart'}));
zipfile.on('end',callback);
});
}
function copydata(){
return new Promise(function(callback,error_callback){
if (path.extname(folder + '/samples' + version + '/data') != '.DS_Store' && path.extname(folder + '/samples' + version + '/data') != '.svn' && path.extname(folder + '/samples' + version + '/data') != '__MACOSX') {
fs.copy(folder + '/samples' + version + '/data','./quickstart/prestashop/install/data/', function() {
console.log("coppy thanh cong toi thu muc data");
callback();
});
}
else {
error_callback('not found');
}
});
}
,你現在可以這樣調用:
createDir()
.then(unZip)
.then(copydata)
.then(function(){
console.log('all done!');
});
的可能重複[我怎樣才能讓這個呼叫的NodeJS同步要求?( http://stackoverflow.com/questions/9884418/how-can-i-make-this-call-to-request-in-nodejs-synchronous) – Seth