2017-01-04 1 views
0

방금 ​​약속을 배우기 시작했습니다. 콘솔 결과가 [약속 중입니다.] [보류 중] 기능에서 오는 정확한 결과를 인쇄하고 싶습니다. 아무도 도와 줄 수 없습니다. 이.약속 결과에서 인쇄 결과를 인쇄하는 방법

exports.listProjectRepos1 = (req, res)=> { 
    let pID = mongoose.Types.ObjectId(req.params.projectId); 
    console.log("User Id is ", req.user._id); 
    let query = { 
     userID: mongoose.Types.ObjectId(req.user._id), 
     projectID: pID 
    }; 
     RepositoriesSchema.find(query).lean().then((repos)=> { 
      return repos 
     }).then((repos)=> { 
      let roots = repos.map(exports.populateCodestack1); 
      console.log(roots);// trying to Print the Results here 
     }); 
}; 


exports.populateCodestack1 = function (repo) { 
    return new Promise((resolve, reject)=> { 
     Promise.all([new Promise((resolve, reject)=> { 
      let codeId = repo.codeStack; 
      CodeStacksSchema.findOne({ID: codeId}).lean().exec(function (err, codeStack) { 
       if (codeStack) { 
        repo.stack = codeStack.name; 
        resolve(repo) 
       } 
      }); 
     }), 
      new Promise((resolve, reject)=> { 
       let owner = mongoose.Types.ObjectId(repo.SCMAccount); 
       console.log("Owner Id is", owner); 
       ScmaAccount.findOne({_id: owner}).lean().exec(function (err, scm) { 
        if (scm) { 
         repo.type = scm.type; 
         resolve(repo); 
        } 
       }); 
      }) 

     ]).then(function (result1) { 
      // console.log("Refresh Result",result); 
      resolve(result1); 
     }) 
    }) 
}; 

출력 기능을 인쇄하고 싶습니다.

+1

피하기 ['Promise' 생성자 반 패턴 (http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! 단순히'promise.all (...)'을 돌려 주면 아무것도 포장하지 마십시오. 그리고 실수로 인해 약속을 거부하는 것을 잊지 마십시오. – Bergi

답변

3

exports.populateCodestack1은 Promise를 반환하므로 roots에는 약정 목록이 포함됩니다.

배열의 모든 약속이 해결 될 때까지 기다리려면 Promise.all으로 전달하십시오. 그 옆에

RepositoriesSchema.find(query).lean() 
    .then(repos => Promise.all(repos.map(exports.populateCodestack1))) 
    .then(roots => { 
    console.dir(roots); 
    }); 

: 당신이 다음 new Promise를 사용하는 경우 당신은 당신에게 오류 사례를 처리해야하고, 당신이 약속을 지원하지 않는 기능을 포장해야하는 경우에만 new Promise를 사용하지만, 결코 기존의 약속 객체를 포장 :

exports.populateCodestack1 = function(repo) { 
    return Promise.all([ 
    new Promise((resolve, reject) => { 
     let codeId = repo.codeStack; 
     CodeStacksSchema.findOne({ 
     ID: codeId 
     }).lean().exec(function(err, codeStack) { 
     if (err) { 
      reject(err); 
     } else { 
      repo.stack = codeStack.name; 
      resolve(repo) 
     } 
     }); 
    }), 
    new Promise((resolve, reject) => { 
     let owner = mongoose.Types.ObjectId(repo.SCMAccount); 
     console.log("Owner Id is", owner); 
     ScmaAccount.findOne({ 
     _id: owner 
     }).lean().exec(function(err, scm) { 
     if (err) { 
      reject(err) 
     } else { 
      repo.type = scm.type; 
      resolve(repo); 
     } 
     }); 
    }) 
    ]) 
}; 

편집

몽구스 LIB 이미 약속을 지원하기 때문에 그것을 사용하여 더욱를 단순화 할 수 있어야한다 :

exports.populateCodestack1 = function(repo) { 
    return Promise.all([ 
    CodeStacksSchema.findOne({ 
     ID: repo.codeStack 
    }).lean().then(codeStack => { 
     repo.stack = codeStack.name; 
     return repo 
    }), 
    ScmaAccount.findOne({ 
     _id: mongoose.Types.ObjectId(repo.SCMAccount) 
    }).lean().then(scm => { 
     repo.type = scm.type; 
     resolve(repo); 
    }) 
    ]) 
}; 
+0

'.then ((repos) => {return repos})'가 중복되었습니다. –

+0

@DanielB 예, 처음에는 코드가 약간 지저분하다는 것을 알지 못했습니다. –

+0

@DanielB u는 나에게 설명 할 수있다 그것의 과다한 .. 나는 방금 배운다. 좀 더 설명해 주실 래요? – Jeevan