2016-04-19 57 views
0

我有3個功能:如何順序運行3個函數?

function createDir(){ 
    fs.mkdirs('./quickstart',function(){ 
     console.log("thao thanh cong"); 
    }); 
} 
function unZip(){ 
    fs.createReadStream('./prestashop_cache/' + quickstart).pipe(unzip.Extract({path:'./quickstart'})); 
    console.log("giai nen xong"); 
} 
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"); 
     }); 
    } 
} 

我想上述3個功能執行:createDir()完成 - >解壓縮();完成 - > copydata();

+0

的可能重複[我怎樣才能讓這個呼叫的NodeJS同步要求?( http://stackoverflow.com/questions/9884418/how-can-i-make-this-call-to-request-in-nodejs-synchronous) – Seth

回答

1

您可以使用promises或async包來完成此任務。

如果您更喜歡使用異步包,則可以使用async.waterfall(...)函數,該函數接受異步函數並按順序執行它們。您可以選擇僅通過async-waterfall包導入此功能。

此外,如果你選擇async-waterfall,你可能不得不做這樣的事情(我還沒有測試此代碼,所以你可能需要做一些修改,使之爲你工作):

var waterfall = require('async-waterfall');  

function createDir(callback){ 
    fs.mkdirs('./quickstart',function(){ 
     console.log("thao thanh cong"); 
     callback(null); 
    }); 
} 
function unZip(callback){ 
    var stream = fs.createReadStream('./prestashop_cache/' + quickstart).pipe(unzip.Extract({path:'./quickstart'})); 

    stream.on('finish', function() { 
     console.log("giai nen xong"); 
     callback(null);    
    });   

} 
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"); 
      callback(null); 
     }); 
    } 
} 

waterfall([ 
    createDir, 
    unZip, 
    copydata 
], function(err) { 
    // you callback 
    // will be executed after all functions finish 
}); 
1

您基本上需要執行打印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!'); 
});