gpt4 book ai didi

javascript - 在 javascript 中查看所有未决的 promise

转载 作者:行者123 更新时间:2023-11-29 16:06:53 25 4
gpt4 key购买 nike

在我的测试中,有时我会超时,查看在超时之前挂起的 promise 是非常有用的,这样我就知道哪些 promise 最有可能处于“始终挂起状态” .

有办法吗?

示例代码:

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 中获取 promise secondFunction 的函数名称和堆栈跟踪,因为它永远不会解析。

最佳答案

promise 链的设计旨在逐步传递成功路径中的值(value)或错误路径中的“原因”。它的设计目的不是为了在某个任意时间点查询它吸收的各个 promise 的状态的“快照”。

因此, promise 链没有提供“自然”的方式来完成您的要求。

您需要设计一种机制:

  • 注册利益 promise 。
  • 跟踪每个已注册 promise 的状态(如果 promise 实现尚未提供)。
  • 按需检索已注册的 promise ,按状态过滤。

沿着这些路线的构造函数将完成这项工作:

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 链吸收的 promise。它可以用于任意一组 promise ,例如一组要与 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);
});

关于javascript - 在 javascript 中查看所有未决的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com