プロミスチェーンは、成功パスまたはエラーパスの「理由」の値を提供するように徐々に設計されています。それは、それが同化する個々の約束の状態を「スナップショット」として、ある時点で問い合わされるようには設計されていない。
したがって、約束チェーンは、あなたが求めるものを行うための「自然な」方法を提供しません。
あなたはのための仕組みを工夫する必要があります。興味のある約束を登録
- 。
- (登録済みの約束の状態がまだ提供されていない場合)
- オンデマンドで登録された約束を州ごとに取り上げます。これらの線に沿って
コンストラクタは、仕事をする:質問で必要とされる
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の中に、保留中の非同期操作を監視環境を約束]
http://stackoverflow.com/q/38781512/1048572)? – Bergi
うわー..あなたはひどく混乱しています...約束事に入ると同期タイムラインを返す方法はありません(非同期タイムラインとも呼ばれます)。 – Redu
それは、その周りのいくつかの機能かもしれません、それは単にタイムラインのようであり、すべてのリンクは明示的です。あなたがこの種の情報を得られるように約束することができます。 – edi9999