对每个承诺的更多承诺node.js / js

我有一个承诺的function,循环医院,酒店和赌博。 然后它正在合并并返回它。

重写这个函数的最好方法是什么,所以每个promiseArrs结果都可以循环,并做一些更有前途的工作?

  function GetOwnedFirms(userid) { var promiseArr = [ hospital.find({userid: userid}), hotel.find({owner: userid}), gambling.find({userid: userid}), ]; return Promise.all(promiseArr).then(function (results) { // Want to loop trough each results with a new promise etc.. // call funct1 promise to hospital, func2 to hotel, etc etc. // then after everything is done, concat them and return. var OwnedFirms = results[0].concat(results[1], results[2]); return OwnedFirms; }); } 

如果你想循环这些结果,并做更多的操作导致承诺,只要这样做,并返回Promise.all在你的callback之外的那些操作的结果:

 function GetOwnedFirms(userid) { var promiseArr = [ hospital.find({userid: userid}), hotel.find({owner: userid}), gambling.find({userid: userid}), ]; return Promise.all(promiseArr).then(function(results) { return Promise.all(results[0].concat(results[1], results[2]).map(function(firm) { return doSomethingThatGeneratesAPromiseWith(firm); })); }); } 

请记住,承诺链是stream水线,每个stream水线或catch处理程序都可以转换遍历的结果,包括asynchronous操作。 then catch创造新的承诺。 如果你从一个callback或callback中返回一个承诺, then由此产生的承诺就会成为你回报的承诺。


重新评论:

但是我必须每隔一个槽子,医院才会有一种承诺,酒店另一种等等。

但后来我想知道如何将每个结果转化为另一个承诺,然后在最终(在全部归还之前),将它们结合起来:)导致0(医院)必须做一些与酒店不同的事情。 我担心如果我做错了。 在返回并梳理之前,我需要完成所有的结果。

正如我在评论中所说的,你只是将相同的主体应用于个人的结果。 最简单的方法就是在你的Promise.all之前:

 function GetOwnedFirms(userid) { return Promise.all([ hospital.find({userid: userid}).then(function(hospital) { return doSomethingAsyncWithHospital(hospital); }), hotel.find({owner: userid}).then(function(hotel) { return doSomethingAsyncWithHotel(hotel); }), gambling.find({userid: userid}).then(function(gambling) { return doSomethingAsyncWithGambling(gambling); }) ]).then(function(results) { return results[0].concat(results[1], results[2]); }); } 

看看我们仍然在使用承诺链是pipe道的事实。 我们正在改变三个链条中的每一个,最后把它们聚集在一起(我假设你确实想要这样做;如果不是这样的话,只需要移除那个最终的句柄)。