2016-09-07 2 views
0

몇 가지 데이터베이스 조회를 수행하기 위해 Promise 기반 ORM 모듈 인 Bookshelf.js를 사용하고 있습니다. 사용자가 제공하는 키가 주어지면 키가 두 테이블 중 하나의 레코드와 일치하는지 확인해야합니다. 첫 번째 표에서 찾으면 그 기록을 반환해야합니다. 그러나 첫 번째 표에서 찾지 못하면 두 번째 표를 살펴 봐야합니다. 기본적으로 조건부로 then 블록을 실행해야합니다. 약속을 사용하여이를 어떻게 수행합니까? 제가 현재 가지고있는 것은 매우 지저분합니다. 실제로 resolve을 첫 번째 School 룩업에서 호출하면 어떤 일이 일어날 지에 대해 약간의 불확실성이 있습니다 - 두 번째 then 블록도 실행됩니까?약속을 사용하여 조건부로 두 번째 작업을 수행하려면 어떻게합니까?

exports.findTargetRecord = function(code){ 

    return new Promise(function(resolve, reject){ 
     Schools 
     .query({ where: { code: code }}) 
     .fetchOne() 
     .then(school => { 
      if(school) return resolve(school); 
      return Organizations 
        .query({ where: { code: code }}) 
        .fetchOne(); 
     }) 
     .then(org => { 
      if(org) return resolve(org); 
      resolve(null); 
     }) 
     .catch(err => reject(err)); 
    }); 
}; 

더 깨끗한 방법이 있습니까?

그냥 then 블록 내부 전체 else 논리를 유지할 수
+0

http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i -avoid-it –

답변

2

사용 약속과 규칙적인 if :

exports.findTargetRecord = function(code){ 

    const school = Schools.query({ where: { code: code }}).fetchOne(); 
    school = school.then(school => 
    school || Organizations.query({ where: { code: code }}).fetchOne()) 
    return school; 
} 

또는 루틴있는 블루 버드 지원 (책장 블루 버드 선박) :

exports.findTargetRecord = Promise.coroutine(function*(code) { 
    var school = yield Schools.query({ where: { code: code }}).fetchOne(); 
    if(school) return school; 
    return Organizations.query({ where: { code: code }}).fetchOne(); 
}); 
+0

감사합니다. 이것은 내가 찾고있는 것보다 더 비슷합니다. 그것은 여전히 ​​깨끗하고 읽기 쉬운 슈퍼는 아니지만, 내가 현재 가지고있는 것과는 다른 점이있어서 함께 작업 할 수있는 옵션이 있습니다. – user2719094

2

이 같은

exports.findTargetRecord = function(code){ 

    return new Promise(function(resolve, reject){ 
     Schools 
     .query({ where: { code: code }}) 
     .fetchOne() 
     .then(school => { 
      if(school) return resolve(school); 
      return Organizations 
        .query({ where: { code: code }}) 
        .fetchOne() 
        .then(org => { 
         if(org) return resolve(org); 
         resolve(null); 
        }) 
     }) 
     .catch(err => reject(err)); 
    }); 
}; 

또한 코드가 rewriten 수 (짧은 버전) : 프록시로

exports.findTargetRecord = function(code){ 
    return Schools 
      .query({ where: { code: code }}) 
      .fetchOne() 
      .then(school => { 
       if(school) return school; 
       return Organizations 
         .query({ where: { code: code }}) 
         .fetchOne(); 
      }) 
      .catch(err => reject(err));