programing

Node.js - 여러 비동기 호출 대기

magicmemo 2023. 7. 15. 10:01
반응형

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

반응형