2017-09-29 31 views
1

私は約束を持っており、病院、ホテル、そしてギャンブルを繰り返す機能を持っています。 それは現在、マージして返しています。各約束についてもっとお約束node.js/js

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; 
    }); 
} 
+3

「もっともっと有望な」とはどういう意味ですか?あなたは何をしたいですか? – PeterMader

答えて

2

あなたはそれらの結果をループにしたいとの約束が得られ、より操作を行う場合は、単にそれを行うと、あなたのthenコールバックのうち、それらの操作にPromise.allの結果を返します:

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); 
     })); 
    }); 
} 

は覚えておいてくださいその約束チェーンはパイプラインであり、それぞれのthenまたはcatchハンドラは、非同期操作を含めて通過する結果を変換できます。 thenおよびcatchは新しい約束を作成します。 thenまたはcatchコールバックの約束を返すと、thenまたはcatchによって作成された約束は、返す約束に従わなければなりません。あなたのコメントを再


しかし、私はseperatlyそれらのそれぞれの谷行かなければならないが、病院は別などどうであろうと仕事の約束の一種、ホテルを持っているのだろうか?

...

は、しかし、私は私がしなければならないもう一つの約束への結果のそれぞれを行い、その後、最終的に(それをすべて返す前に)、それらを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]); 
    }); 
} 

は、我々はまだチェーンがパイプラインです約束事実を使用している方法を参照してください。 3つのチェーンのそれぞれを変えていって、最後に一緒に集めます(そうしたいと思っていると思いますが、そうでなければ最後のthenハンドラを取り除くだけです)。

+0

良いアイデア。しかし、私はそれぞれ別々に旅をしなければなりません、病院は1つの種類の約束、ホテルの別のものなどを持っています。 – maria

+0

ああ。しかし、私はどのように私は結果のそれぞれを別の約束にし、最終的に(それをすべて返す前に)、それらを組み合わせるだろう:) 0(病院)はホテルとは異なる何かをしなければならない。私はそれが間違っている場合私は心配しています。私はすべての結果を返す前に新しい約束をしておく必要があります。それが意味を作ったら? – maria

+1

@maria:私は上記の最後に追加しました。再度、パイプラインのコンセプトを適切な場所に適用するだけです。 HTH。 –