2014-07-20 4 views
0

모델을 데이터베이스에 저장하기 전에 고유 한 ID를 생성합니다. 그래서 난 임의의 고유 ID를 생성하고 해당 ID를 사용할 수 있는지 확인하는 메서드를 호출하는. 여기에 내가 사용하고 while 루프입니다 그러나 그것은 결코 while 루프에서 중단하지 : 나는 비동기 라이브러리를 사용하지만 해요asyncc.js가 비동기 호출을 순환합니다.

beforeValidation: function(values, next) { 

var counter = 0; 
var slug = SlugService.generate_slug(); 

console.log(counter + ":" + slug); 
async.whilst(
    function() { return values.slug === undefined && counter <= 10; }, 
    function (callback) { 
    counter++; 
    Lists.findOne({slug: slug}).exec(function(err, list) { 
     if (list === undefined) values.slug = slug; 

     slug = SlugService.generate_slug(); 
     console.log(counter + ":" + slug); 
    }); 
    }, 
    function (err) { 
    console.log("err"); 
    values.slug = slug; 
    } 
); 

next(); 

}

가 작동하지 않는 것 같습니다. 그냥 next()를 호출합니다. 루프가 끝나기 전에.

는 또한 서비스 클래스를 생성하고 거기에이 방법을 추가하지만이 나던 중 하나가 작동하는 것 :

function checkSlug(method, counter) { 
    slug = SlugService.generate_slug(); 
    method({ slug: slug }).exec(function(err, list) { 
    if (list !== undefined && counter <= 10) { 
     counter++; 
     checkSlug(); 
    } 
    }); 
} 

내가 너무 내 모든 모델에 걸쳐이 공유 할 수있는 작업 옵션 # 2를 취득하는 것을 선호합니다.

답변

0

비동기 기능에서 다른 실수가 있습니다.

1) 당신은 당신의 기능에 콜백을 해달라고 (참조 : https://github.com/caolan/async#whilst를) 2) 당신은 비동기이 시도

를 완료하기 전에 돛 콜백 전화 :

beforeValidation: function(values, next) { 

    var slug = ""; 

    async.whilst(
    function check_slug() { return values.slug === undefined }, 
    function generate_slug(callback) { 

     slug = SlugService.generate_slug(); 

     Lists.findOne({slug: slug}).exec(function(err, result) { 
     if (err) { 
      return callback(err); 
     } 

     if (result === undefined){ 
      values.slug = slug; 
     } 

     callback(); 
    }); 
    }, 
    function (err) { 
    if(err){ 
     return console.log(err); 
    } 

    next(); 
    }); 
} 
관련 문제