2017-01-19 1 views
1

startという名前の関数では、3つの関数が連続して呼び出されます。すべての関数が実行された後、コンテナ関数startが再度呼び出されます。3つの関数を非同期で実行し、3つの関数が完了するまで待機します。

3つの関数を並列または非同期に実行できる方法はありますか?3つすべてが完了すると、startメソッドが再度呼び出されます。

function start(){ 
    resolveErrorQueue((err,data)=>{ 
      if(err) 
       console.log(err); 
      else{ 
       checkIfAlive((err,data) => { 
        if(err) 
         console.log(err); 
        else{ 
         prepareServer((err,data) => { 
         if(err) 
          console.log(err); 
         else 
          start(); 
         }); 
        }      
       }); 
      }    
    }); 
} 

答えて

1

クリーンな方法は、約束のライブラリを使用しています。例えば、Qにあなたは約束せずにそれをしたい場合は、非同期関数が完了するたびにインクリメントされるグローバル変数を作成することができq.all機能

Q.all([getFromDisk(), getFromCloud()]).done(function (values) { 
    assert(values[0] === values[1]); // values[0] is fromDisk and values[1] is fromCloud 
}); 

を使用することができます。その後、3つの非同期関数を呼び出し、コールバックでグローバル変数をインクリメントします。また、必要に応じて返品データをグローバルに保存することもできます。

whileループまたはsetIntervalを使用して、3つの関数がすべて返されたかどうかを確認できます。

0

あなたが何を後にしているのか分かりませんが、このようなものでしょうか?

function start(){ 
    var leftToRun = 3; 

    resolveErrorQueue((err,data)=>{ 
     if(err) 
      console.log(err); 
     else{ 
      if (--leftToRun === 0) { start(); } 
     } 
    }); 

    checkIfAlive((err,data) => { 
     if(err) 
      console.log(err); 
     else{ 
      if (--leftToRun === 0) { start(); } 
     } 
    }); 

    prepareServer((err,data) => { 
     if(err) 
      console.log(err); 
     else 
      if (--leftToRun === 0) { start(); } 
    }); 
} 

ノードは一つのスレッドだけでコードを実行しますので、それは実際には、parallellに実行されませんが、あなたが呼び出す操作が非同期である場合、機能が順番に完了する必要はありません。 asyncモジュールのparallel使用

1

:あなたのメソッドので

async.parallel([resolveErrorQueue, checkIfAlive, prepareServer], (err, results) => { 
    if (err) 
    console.error(err); 
    else 
    start(); 
}); 

asyncモジュールがうまくフィットするコールバックで動作するようです。メソッドが約束をサポートしている場合は、それもやり遂げることができます。 Bluebird Promise.joinまたはQ.all(@ user2263572のように)を使用します。

1

私は、あなたが約束を使用する必要があるuser2263572のanswerに同意します。 ES6 Promisesを使用すると、v4.7.1以降Node.jsでネイティブにサポートされていても、さらに簡単です。あなたはnodejsでasync.series()方法を使用することができます

function resolveErrorQueue(resolve, reject) { 
 
    setTimeout(() => { 
 
     resolve("no errors in queue"); 
 
    }, 1000); 
 
} 
 

 
function checkIfAlive(resolve, reject) { 
 
    setTimeout(() => { 
 
     resolve("server is alive"); 
 
    }, 999); 
 
}; 
 

 
function prepareServer(resolve, reject) { 
 
    setTimeout(() => { 
 
     resolve("server is prepared"); 
 
    }, 1001); 
 
}; 
 

 
var counter = 0; 
 
function start() { 
 
    Promise.all([new Promise(resolveErrorQueue), new Promise(checkIfAlive), new Promise(prepareServer)]).then(values => { 
 
     console.log(`${++counter}: ${values}`); 
 
     start(); 
 
    }); 
 
} 
 
start();

0

:ここ

は、実施例です。 asyncは、nodejsで非同期メソッドを実行するさまざまな方法を提供するモジュールです。例えば

async.series([function1,function2,function3],function(err,result{ 
if(err){ 
     // do here if error occured. 
    } 
     console.log(result); 
    // DO here what you want to do after function1, function2 and function3 completion. 
}); 


var function1 = function(cb){ 
    // do here in function1 
     cb(null,'ok'); 
    }; 

var function2 = function(cb){ 
    // do here in function2 
     cb(null,'ok'); 
    }; 

var function3 = function(cb){ 
    // do here in function3 
     cb(null,'ok'); 
    }; 

あなたはasync.series()で引数としての機能の任意の数を追加することができます。

関連する問題