2016-10-14 6 views
1

こんにちは私は約束が新しく、forループ内のすべての約束を待ってから次の)。私は、いくつかのpromise.all例を見たことがありますが、それは私の次のコードのためにそれらを適応させる方法は明らかではありませんでした。現在、forループの後にnext()に行き、forループが完了する前に解決します。どんな助けもありがとう!ノード内のpsql(pg-promise)を使用して、forループ/ promise.allを約束します。

pg-promise(約束通りのpsql)を使用しています。

オリジナルコード:

function getTeamMembers(aTeam) { 
    let promise = new Promise(function(resolve, reject) { 
     db.getTeamMembers(aTeam.tid) //return sql results rows 
     .then(function(rows){ 
      for(let i=0; i<rows.length; ++i) { //loop through each result row 
      getUserByUsername(rows[i].username) 
       .then(function(cfUser) { //add user from row to aTeam object      
       aTeam.addMember(cfUser); 
       }) 
       .catch(function(e) { 
       reject(e); 
       }); 
      } 
     }) 
     .then(function(){ 
      console.log(aTeam); //confirm added properly 
      resolve(aTeam); //resolve object 
     }) 
     .catch(function(e) { 
      console.log('addMemberToTeamByUsername: '+e.stack); 
      reject(e); 
     }); 
    }); 
    return promise; 
    } 

答えて

2

私はpg-promiseの著者です。

ここでは、今削除された回答の中で、Promise.allの無効な使用についてのいくつかの考慮事項を以下に示します。


物理的なリソースを表し約束ベースのインターフェイスを使用している場合、使われている物理的な文脈を理解することが重要です。それがなければ、物理的なリソースが一般的な約束のソリューションのように拡張されないという単純な事実からボトルネックに陥るリスクがあります。 pg-promiseあなたの物理的な文脈の場合

は二つで構成されます。

  • クエリ文字列は、Node.jsのIOを通じて接続プールによって提供さ
  • 接続コンテキストをパイプする

各クエリ要求は、非常に限定された物理リソースである接続プールから接続を取得して解放します。プールのデフォルトサイズは、基になるドライバnode-postgresによって設定された10です。また、最大100まで増やすこともできますが、そうすることで接続管理に過負荷が発生するため、スケーラビリティが向上しません。典型的な増加は平均約20である20に設定される。

クエリの配列にPromise.allを使用すると、アプリはプールをほぼ即座に使い果たし、サービスへの次のリクエストは利用可能な接続を待つだけです。

このようなソリューションは、スケールすることはできません。ここではクエリ実行のパターンとして、Tasks versus root/direct queriesが挙げられています。あなたがデータ

  • 方法tx(トランザクション)を変更していない場合は、データ
  • を変更している場合は、

    • 方法task

      基本的には、どのようなそれが説明すると、タスクを介して複数のクエリを実行する必要がありますあります

    このようにして、すべてのクエリを単一の接続でパイプすることができます。これは、サービスのスケーラビリティを実現するために不可欠です。


    TasksTransactionsの両方のためのLearn By Exampleチュートリアル内の例がたくさんあります。


    そして、あなたは、複数の子行をみとめ、親行を取得しようとしていることを考えると、あなたはこの質問をご覧ください:get JOIN table as array of results with PostgreSQL/NodeJS

    Performance Boostの記事を読んで、複数のクエリを実行する際の物理的な制限とその解決方法を理解することをお勧めします。 get JOIN table as array of results with PostgreSQL/NodeJS:このアプローチは、次の質問で、より良い配慮がなされている)

    ;

    function getTeamMembers(aTeam) { 
        return db.task(t=> { 
         return t.map('SELECT * FROM team_members WHERE id=$1', aTeam.id, tm=> { 
          return t.any('SELECT * FROM users WHERE name=$1', tm.username) 
           .then(users=> { 
            tm.users = users; 
            return tm; 
           }); 
         }).then(t.batch); 
        }); 
    } 
    
    // usage example: 
    
    getTeamMembers({id: 123}) 
        .then(members=> { 
         // members = array of member objects 
        }) 
        .catch(error=> { 
         // error 
        }); 
    

    これはそれを行うための唯一の方法ではありませんが、それは最短で

    例。

    +0

    誰がこれを落としたのだろうか。しかし、コードを追加する必要がありますか? – Bergi

    +0

    @Bergi、ええ、私は仕事から急いで答えていました。最初の回答者(今削除されている)からの批判にも遭遇しました。それはちょうど悪い一日だと思います。 –

    +0

    こんにちはVitaly - 例としていくつかのコードを提供できますか?私はそれを見てみたい!私はあなたの提案を見て、私の知識とコードを高めるのを助けてくれてありがとう! –

    関連する問題