2017-01-04 6 views
0

Я только начал изучать обещания, я получаю результат консоли как [Обещание] Я хочу напечатать точный результат, исходящий от функции, может кто-нибудь мне помочь это.Как напечатать результат, исходящий из функции Promise

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)! Просто 'return 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 если вам нужно обернуть функцию, которая не поддерживает обещания, но не обернуть существующий объект 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); 
     } 
     }); 
    }) 
    ]) 
}; 

EDIT

Поскольку мангуст 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 может у, пожалуйста, объясните мне, как его избыточно. Я только что сказал обучение. не могли бы вы объяснить мне больше. – Jeevan