2016-04-19 61 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!'); 
});