2017-01-19 57 views
1

在以下函數start中連續調用三個函數。在執行完所有功能之後,再次調用容器功能start異步運行三個函數並等待三個函數完成

有沒有什麼辦法,我可以在這裏並行或異步地運行這三個函數,當所有三個函數完成時,再次調用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運行,由於節點只能在一個線程中運行你的代碼,但如果你調用的操作是異步的,功能不必爲了完成。

1

使用async模塊的parallel

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

因爲你的方法似乎有回調async模塊工作將吻合。如果方法也支持承諾,那麼也可以完成,例如,使用藍鳥Promise.join或Q.all(如@ user2263572所述)。

1

我同意user2263572的answer你應該使用承諾。使用ES6 Promises更爲簡單,自從v4.7.1以來,它們已經得到了Node.js的本地支持。

這裏有一個工作示例:

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.series()方法的NodeJS。 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()添加任何數量的函數作爲參數。

相關問題