对每个承诺的更多承诺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道的事实。 我们正在改变三个链条中的每一个,最后把它们聚集在一起(我假设你确实想要这样做;如果不是这样的话,只需要移除那个最终的句柄)。