복붙노트

[MONGODB] Node.js를 - 여러 비동기 호출에 대한 대기

MONGODB

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

나는이 옥 템플릿을 렌더링하기 전에 여러 MongoDB의 쿼리를 만들려고 노력하고있어,하지만 난 꽤 모든 몽고 쿼리 템플릿을 렌더링하기 전에 완료 될 때까지 기다려야하는 방법을 알아낼 수 없습니다.

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
    });

};

해결법

  1. ==============================

    1.나는 보통 후에 만 ​​실행하는이 시간의 특정 번호를 호출되고있는 함수를 만듭니다하는 _.after 사용 그래서 나는, 밑줄 / lodash의 큰 팬입니다.

    나는 보통 후에 만 ​​실행하는이 시간의 특정 번호를 호출되고있는 함수를 만듭니다하는 _.after 사용 그래서 나는, 밑줄 / lodash의 큰 팬입니다.

    var finished = _.after(2, doRender);
    
    asyncMethod1(data, function(err){
      //...
      finished();
    });
    
    asyncMethod2(data, function(err){
      //...
      finished();
    })
    
    function doRender(){
      res.render(); // etc
    } 
    

    자바 스크립트 호이스트 때문에 함수 funcname에 () 구문을 사용하여 정의 함수의 정의, 코드는 자연스럽게 읽 위에서 아래를.

  2. ==============================

    2.당신이 다음을 시작하기 전에 병렬보다는 마무리 한 대기에서이 작업을 실행하려면 가정하면, 각 콜백 완료 얼마나 많은 작업을 추적해야합니다.

    당신이 다음을 시작하기 전에 병렬보다는 마무리 한 대기에서이 작업을 실행하려면 가정하면, 각 콜백 완료 얼마나 많은 작업을 추적해야합니다.

    원시 Node.js를의 자바 스크립트에서 하나 개의 방법이이 될 것이라고해야 할 일 :

    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
                });
            }
        }
    
    };
    

    기본적으로 무슨 일이 일어나고 모두 완료 한 경우 각 작업의 끝에서 확인하고, 그 시점에서 당신이 작업을 마무리한다는 것이다 있어요.

    당신이 이런 일을 많이하고 있다면, 쉽게 이런 종류의 물건을 관리 할 수 ​​있도록하는 도구의 예로서 비동기 라이브러리를보십시오.

  3. ==============================

    3.당신은 비동기 모듈을 사용할 수 있습니다 :

    당신은 비동기 모듈을 사용할 수 있습니다 :

    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
    });
    
  4. ==============================

    4.뭘요 https://github.com/luciotato/waitfor

    뭘요 https://github.com/luciotato/waitfor

    뭘요를 사용하여 :

    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
            }
        );
    
    };
    

    병렬지도 뭘요 사용하여 병렬로 요청 :

    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);
    }
    

    당신이 전화를 조정해야 할 수도 있습니다, 그래서 나는 몽고에 익숙하지 않다.

  5. ==============================

    5.이 await를 사용하여 코드의 최소 라인처럼 보인다 :

    이 await를 사용하여 코드의 최소 라인처럼 보인다 :

    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 역할을한다 await를이 경우에는 ()에 await를 기능을 남용하지 않도록주의하십시오.

  6. from https://stackoverflow.com/questions/18008479/node-js-wait-for-multiple-async-calls by cc-by-sa and MIT license