2016-09-01 9 views
1

私のテストではタイムアウトが発生することがありますが、タイムアウト前に約束されていた約束がどこにあるのかを知ることは非常に便利です。 「常に保留状態」である。javacriptで保留中の約束をすべて表示する

これを行う方法はありますか?ここで

はサンプルコードです:

Promise.resolve().then(function firstFunction() { 
    console.log(1); 
    return 1; 
}).then(function() { 
    return new Promise(function secondFunction(resolve, reject) { 
     // NEVER RESOLVING PROMISE 
     console.log(2); 
    }); 
}).then(function thirdFunction() { 
    // function that will never be called 
    console.log(3); 
}) 

setTimeout(function timeoutTest() { 
    const pendingPromises = [];// ??????????? how do I get the pendingPromises 
    console.log(pendingPromises); 
    process.exit(); 
}, 5000); 

可能であればそれが解決されることはありません一つですので、私は、pendingPromisesに約束secondFunctionの機能とスタックトレースの名前を取得するには、したいと思います。

+0

http://stackoverflow.com/q/38781512/1048572)? – Bergi

+0

うわー..あなたはひどく混乱しています...約束事に入ると同期タイムラインを返す方法はありません(非同期タイムラインとも呼ばれます)。 – Redu

+0

それは、その周りのいくつかの機能かもしれません、それは単にタイムラインのようであり、すべてのリンクは明示的です。あなたがこの種の情報を得られるように約束することができます。 – edi9999

答えて

1

プロミスチェーンは、成功パスまたはエラーパスの「理由」の値を提供するように徐々に設計されています。それは、それが同化する個々の約束の状態を「スナップショット」として、ある時点で問い合わされるようには設計されていない。

したがって、約束チェーンは、あなたが求めるものを行うための「自然な」方法を提供しません。

あなたはのための仕組みを工夫する必要があります。興味のある約束を登録

  • (登録済みの約束の状態がまだ提供されていない場合)
  • オンデマンドで登録された約束を州ごとに取り上げます。これらの線に沿って

コンストラクタは、仕事をする:質問で必要とされる

function Inspector() { 
    var arr = []; 
    this.add = function(p, label) { 
     p.label = label || ''; 
     if(!p.state) { 
      p.state = 'pending'; 
      p.then(
       function(val) { p.state = 'resolved'; }, 
       function(e) { p.state = 'rejected'; } 
      ); 
     } 
     arr.push(p); 
     return p; 
    }; 
    this.getPending = function() { 
     return arr.filter(function(p) { return p.state === 'pending'; }); 
    }; 
    this.getSettled = function() { 
     return arr.filter(function(p) { return p.state !== 'pending'; }); 
    }; 
    this.getResolved = function() { 
     return arr.filter(function(p) { return p.state === 'resolved'; }); 
    }; 
    this.getRejected = function() { 
     return arr.filter(function(p) { return p.state === 'rejected'; }); 
    }; 
    this.getAll = function() { 
     return arr.slice(0); // return a copy of arr, not arr itself. 
    }; 
}; 

唯一の方法は.add().getPending()です。その他は完全性のために提供されています。

あなたは今書くことができます。

var inspector = new Inspector(); 

Promise.resolve().then(function() { 
    console.log(1); 
}).then(function() { 
    var p = new Promise(function(resolve, reject) { 
     // NEVER RESOLVING PROMISE 
     console.log(2); 
    }); 
    return inspector.add(p, '2'); 
}).then(function() { 
    // function that will never be called 
    console.log(3); 
}); 

setTimeout(function() { 
    const pendingPromises = inspector.getPending(); 
    console.log(pendingPromises); 
    process.exit(); 
}, 5000); 

fiddle

Inspectorの使用が約束鎖によって同化約束に限定されません。 Promise.all()と集約すること、例えば、約束の任意のセットのためのセットを使用することができる。

promise_1 = ...; 
promise_2 = ...; 
promise_3 = ...; 

var inspector = new Inspector(); 
inspector.add(promise_1, 'promise 1'); 
inspector.add(promise_2, 'promise 2'); 
inspector.add(promise_3, 'promise 3'); 

var start = Date.now(); 
var intervalRef = setInterval(function() { 
    console.log(Date.now() - start + ': ' + inspector.getSettled().length + ' of ' + inspector.getAll().length + ' promises have settled'); 
}, 50); 

Promise.all(inspector.getAll()).then(successHandler).catch(errorHandler).finally(function() { 
    clearInterval(intervalRef); 
}); 
の正確な複製([Node.jsの中に、保留中の非同期操作を監視環境を約束]
+1

ありがとう、私はそれが最良のソリューションだと思う。実際のプロジェクトは、この考え方から始めることさえできます。例えば、すべての約束を見直すことができます:-)。とりあえずありがとう ! – edi9999

1

Bluebirdなどのライブラリを使用することをお勧めします。これはネイティブの約束より約6倍速く、便利な警告と便利な方法を提供します。

関連する問題