2017-12-30 21 views
0

アプリ全体でどれくらいの約束が保留中であるかを知る方法はありますか?node.jsどのくらいの約束が保留中(全世界)

バッチモードでレコードをデータベースに追加しています(続編あり)。各挿入は約束であり、要求のレートは解決よりも高く、保留中の約束の数が増えています。

これにはどのようなアプローチが適していますか?それぞれの挿入を待つのは効率が悪いようですが、保留中の約束が成立すれば最終的には崩壊するだろうと私は思っています。

ここまでは、成長率の分析と可能な解決策の検討、またはいくつかのアイデアを得るために、世界的にどのくらいの約束が待っているかを知りたいと思います。

+0

を拒否スローを再あなたは、配列内の彼らはすべてしているときに処理するためにpromise.allを使用することができ、そのようにそれらへの参照を保持すべきである必要があります終了しました。 – magreenberg

+0

約束を数えないでください(あるいは約束することさえできます)。あなたが懸念している特定の挿入を数えます。 – Bergi

答えて

3

...しかし、私は、保留中の約束を延ばすことは最終的に崩壊すると考えています。

メモリが不足しているか、後続のコネクタが未処理の要求数を処理できないポイントに達したためです。しかし、はい、あなたは未解決のリクエストの数を絶えず増加させたくありません。

あり、あなたにこれを伝えるために、組み込みの何もないですが、あなたは簡単に単純に追跡することにより、傑出しているどのように多くの関連するものの知ることができます。

let outstanding = 0; 
function track(p) { 
    ++outstanding; 
    p.catch(e => e).then(() => { 
     --outstanding; 
    }); 
    return p; 
} 

それからちょうどtrackへの呼び出しであなたのsequelize呼び出しをラップします:

track(calltoSequelize(/*...*/)).then(/*...*/); 

あなたがfinally(またはthe proposalからポリフィルを使用)と約束ライブラリを使用する場合、trackができ:

let outstanding = 0; 
function track(p) { 
    ++outstanding; 
    return p.finally(() => { 
     --outstanding; 
    }); 
} 
+0

ありがとう、最終的にそれはあまり成長しませんでした(決して20に達しませんでした)。 1つの質問、私はあなたの構文を理解していないp.catch(e => e).then()....何がそこにキャッチしますか? (それは動作しますが) – Joan

+1

@ジョアン:それは "貧しい男の'ついに "です。 :-) 'catch'は解決への拒否を引き起こすので、私たちの後続の' then'ハンドラは常に(プロジェクトが拒否したり解決しても)呼び出されます。 (それで、 'then'を呼び出した結果を返すのではなく' p'を返す理由です。なぜなら、私たちは約束を拒否する処理を台無しにしたくないからです。) –

0

thisを使用してアクティブな約束を抑制しようとすることができます。私はあなたがPromise.allをすると仮定します。

TJは良い答えを持っていますが、インクルード値

var trackPromise = (
 
    outstanding => { 
 
    return { 
 
     add:p => { 
 
     outstanding++; 
 
     return p.then(x=>{ 
 
      outstanding--; 
 
      return x; 
 
     }) 
 
     .catch(
 
      err=>{ 
 
      outstanding--; 
 
      return Promise.reject(err); 
 
      } 
 
     ); 
 
     }, 
 
     count:()=>outstanding 
 
    }; 
 
    } 
 
)(0) 
 

 
trackPromise.add(Promise.resolve(22)) 
 
.then(
 
    resolve=>console.log("resolved:",resolve), 
 
    reject=>console.warn("rejected:",reject) 
 
); 
 
trackPromise.add(Promise.reject(0)) 
 
.then(
 
    resolve=>console.log("resolved:",resolve), 
 
    reject=>console.warn("rejected:",reject) 
 
); 
 
console.log("active:",trackPromise.count())