2016-04-19 50 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

約束または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 
      } 
     }); 
    } 
} 

だから今、あなたがこのようにそれらを呼び出すことができます。

createDir(function(){ 
    unZip(function(){ 
     copydata() 
    }); 
}); 

また、あなたが約束を使用することができますNode.jsの新しいバージョンの。それは基本的に同じことを行いますが、チェーン可能構文を持つ:あなたは今、このように呼び出すことができます

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!'); 
}); 
関連する問題