ステップパターンと非同期呼び出しのネストの類似

MongoDBでデータを操作するためのモデルを実装するとき、非同期呼び出しのネストに関する問題を何らかの形で回避する必要があるという結論に達しました。 Node.jsのStepの存在を知らなかったため、自分の自転車を作成することにしました。 親愛なるHabroユーザーの皆さんと共有したいと思います。





エントリー




呼び出しの問題と、キュー内の次の呼び出しへの情報のさらなる転送を解決するために、AQueueモジュール(非同期呼び出しの順次キューの実装)が生まれました。 このモジュールの実装には、Express.jsの中間ルーティングレイヤーの実装で使用される原則があります(たとえば、特定のビューへのアクセスの可能性をチェックするため)。 このメカニズムは、必要なパラメーターを渡してnext()というコールバック関数を呼び出すことで実装されます。



それでは始めましょう!



実装




キューを編成するために、関数が呼び出される順序で入力される配列が選択されました。





  1. 関数 AQueue ( ) {
  2. var that = this ;
  3. あれ。 q = [ ] ;
  4. あれ。 cb = null ;
  5. あれ。 addTo = function ( f ) {
  6. あれ。 q プッシュ ( f ) ;
  7. それを返す ;
  8. } ;
  9. あれ。 next = function ( err 、 data ) {
  10. if ( that。q。length > 0 ) {
  11. var f =それ。 q シフト ( ) ;
  12. if ( err ) {
  13. あれ。 q = [ ] ;
  14. あれ。 cb (エラー、データ) ;
  15. } else {
  16. f (つまり、 次 、エラー、データ) ;
  17. }
  18. } else {
  19. あれ。 cb (エラー、データ) ;
  20. }
  21. } ;
  22. あれ。 完了 = 関数 ( cb ) {
  23. あれ。 cb = cb ;
  24. それを返す ;
  25. } ;
  26. あれ。 run = function ( ) {
  27. それを返します。 next ( null 、 null ) ;
  28. } ;
  29. }
  30. 輸出。 AQueue = AQueue ;




使用する




以下は、AQueueモジュールの使用例です。



  1. var AQueue = reqiure ( 'aqueue' ) 。 AQueue
  2. var aq = new AQueue ( ) ;
  3. 水溶液 addTo ( function ( next 、 err 、 data ) {
  4. //必要なアクションを実行します
  5. 次(エラー、データ) ;
  6. } ) 。 addTo ( function ( next 、 err 、 data ) {
  7. //追加のアクションを実行します
  8. //オブジェクトをラップすることでデータを結合できます
  9. next ( err 、 { data : data 、 checked : true } ) ;
  10. } ) 。 完了 ( function ( err 、 data ) {
  11. //最終アクションを実行します。
  12. } ) 。 実行 ( ) ;



All Articles