Node.js - 여러 비동기 호출 대기
제이드 템플릿을 렌더링하기 전에 MongoDB 쿼리를 여러 개 작성하려고 하는데, 템플릿을 렌더링하기 전에 모든 Mongo 쿼리가 완료될 때까지 기다리는 방법을 잘 모르겠습니다.
exports.init = function(req, res){
var NYLakes = {};
var NJLakes = {};
var filterNY = {"State" : "NY"};
db.collection('lakes').find(filterNY).toArray(function(err, result) {
if (err) throw err;
NYLakes = result;
});
var filterNJ = {"State" : "NJ"};
db.collection('lakes').find(filterNJ).toArray(function(err, result) {
if (err) throw err;
NJLakes = result;
});
res.render('explore/index', {
NYlakes: NYLakes,
NJlakes: NJLakes
});
};
저는 언더스코어/로다쉬의 열렬한 팬이기 때문에 주로 사용합니다._.after
특정 횟수만큼 호출된 후에만 실행되는 함수를 생성합니다.
var finished = _.after(2, doRender);
asyncMethod1(data, function(err){
//...
finished();
});
asyncMethod2(data, function(err){
//...
finished();
})
function doRender(){
res.render(); // etc
}
javascript가 정의한 함수의 정의를 호이스트하기 때문에function funcName()
구문, 코드가 위에서 아래로 자연스럽게 읽힙니다.
다음 작업을 시작하기 전에 한 작업이 완료될 때까지 기다리지 않고 두 작업을 동시에 실행하려는 경우 각 콜백에서 완료된 작업 수를 추적해야 합니다.
raw node.js javascript에서 이를 위한 한 가지 방법은 다음과 같습니다.
exports.init = function(req, res){
var NYLakes = null;
var NJLakes = null;
var filterNY = {"State" : "NY"};
db.collection('lakes').find(filterNY).toArray(function(err, result) {
if (err) throw err;
NYLakes = result;
complete();
});
var filterNJ = {"State" : "NJ"};
db.collection('lakes').find(filterNJ).toArray(function(err, result) {
if (err) throw err;
NJLakes = result;
complete();
});
function complete() {
if (NYLakes !== null && NJLakes !== null) {
res.render('explore/index', {
NYlakes: NYLakes,
NJlakes: NJLakes
});
}
}
};
기본적으로 여기서 일어나는 일은 각 작업이 끝날 때마다 모든 작업이 완료되었는지 확인하고 그 시점에서 작업을 종료하는 것입니다.
이러한 작업을 많이 수행하는 경우 이러한 작업을 보다 쉽게 관리할 수 있는 도구의 예로 비동기 라이브러리를 살펴 보십시오.
비동기 모듈을 사용할 수 있습니다.
var states = [{"State" : "NY"},{"State" : "NJ"}];
var findLakes = function(state,callback){
db.collection('lakes').find(state).toArray(callback);
}
async.map(states, findLakes , function(err, results){
// do something with array of results
});
잠시만요. https://github.com/luciotato/waitfor .
Wait 사용.대상:
exports.init = function(req, res){
var NYLakes = {};
var NJLakes = {};
var coll = db.collection('lakes');
var filterNY = {"State" : "NY"};
var a = wait.forMethod(coll,'find',filterNY);
NYLakes = wait.forMethod(a,'toArray');
var filterNJ = {"State" : "NJ"};
var b = wait.forMethod(coll,'find',filterNJ);
NJLakes = wait.forMethod(b,'toArray');
res.render('explore/index',
{
NYlakes: NYLakes,
NJlakes: NJLakes
}
);
};
wait를 사용하여 병렬로 요청합니다.병렬 지도의 경우:
exports.init = function(req, res){
var coll = db.collection('lakes');
//execute in parallel, wait for results
var result = wait.parallel.map(
[{coll:coll,filter:{"State" : "NY"}}
, {coll:coll,filter:{"State" : "NJ"}}]
, getData);
res.render('explore/index',
{
NYlakes: result[0],
NJlakes: result[1]
}
);
};
//map function
function getData(item,callback){
try{
var a = wait.forMethod(item.coll,'find',item.filter);
var b = wait.forMethod(a,'toArray');
callback (null, b);
} catch(err){
callback(err);
}
저는 몽고에 익숙하지 않아서 통화를 조정해야 할 수도 있습니다.
이것은 대기를 사용하는 코드의 최소 행으로 보입니다.
var async = require("async"); //include async module
...
async function getData() { //make sure to use async function
var NYlakes = await db.collection('lakes').find(filterNY); //can append additional logic after the find()
var NJlakes = await db.collection('lakes').find(filterNJ);
res.json({"NYLakes": NYLakes, "NJLakes": NJLakes}); //render response
}
getData();
참고 사항:이 경우 대기는 다음과 같은 역할을 합니다.Promise.all()
대기 기능을 남용하지 않도록 주의합니다.
언급URL : https://stackoverflow.com/questions/18008479/node-js-wait-for-multiple-async-calls
'programing' 카테고리의 다른 글
Python에서 2차원 배열 회전 (0) | 2023.07.15 |
---|---|
장고에서 동적 필드 룩업으로 쿼리 세트를 어떻게 필터링합니까? (0) | 2023.07.15 |
'구독' 속성이 'void' 유형에 없습니다.Angular 2 asp.net 코어 (0) | 2023.07.15 |
엔디언은 바이트의 비트 순서를 나타낼 수 있습니까? (0) | 2023.07.15 |
정규 분포 그림을 그리는 방법 (0) | 2023.07.15 |