- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的测试中,有时我会超时,查看在超时之前挂起的 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 链没有提供“自然”的方式来完成您的要求。
您需要设计一种机制:
沿着这些路线的构造函数将完成这项工作:
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);
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/
我知道未决 Intent 的概念,但标志令人困惑。 连android文档都很难看懂 有人可以通过示例提供未决 Intent 标志的解释,特别是 FLAG_ONE_SHOT 和 FLAG_NO_CREA
试图显示来自 json 的数据。 当我在控制台上运行我的函数时,它显示: Promise {} 和 [[PromiseState]]:“已完成” 但实际上并没有返回任何东西。 getJobs = as
我的代码是这样的,点击按钮我执行 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMil
function f () { return new Promise(function (resolve, reject) { resolve(4); }) } fun
我有两个 Activity A 和 B。A 在应用程序启动时启动。我有一个从 A 启动的服务。 这是我在 Activity A 中的代码。 Button btnStart = (Button) fin
我正在开发一个应用程序,我想在其中设置自定义闹钟。但是在设置闹钟时间后没有任何反应。我正在分享我的代码。如果我的代码中缺少某些内容,请帮助和指导我。 在我的 MainActivity.java 中
我正在使用 fetch 来获取数据,但它一直将 promise 返回为待处理。我看过很多关于这个问题的帖子,并尝试了所有的可能性,但没有解决我的问题。我想知道为什么 fetch 简要地返回 promi
你好,我有以下在我的应用程序中显示通知的功能,但是我突然开始遇到一个问题,当我单击通知时它不会将我带到我在 .setContentIntent() 中指定的 Activity ,这是我的代码: @Ta
我正在创建一个数据处理程序,作为该过程的一部分,我需要下载一个文件,然后作为处理程序的一部分进行解析和使用。 我将对文件的请求包装在一个 promise 中,并从其他方法异步调用该方法 我已经包含了来
我想做的是通过intent传递数据, >创建者 intent = new Intent(this, AlarmReceiverActivity.class); intent.putExtra("id"
我正在使用 PingService.java 的代码 https://github.com/android/platform_development/blob/master/samples/train
我需要在用户靠近给定地点时通知他。我为此使用地理围栏 API。当我使用模拟位置在 Android 模拟器上测试应用程序时,一切正常。与模拟位置的真实设备相同。但是当我走路并且我的手机处于深度 slee
我有一个显示随机数的简单小部件。点击时它会刷新并显示另一个随机数。这是 AppWidgetProvider 的 onUpdate 方法的代码 public void onUpdate(Context
PendingIntent 中的一个新 PendingIntent 字段是 FLAG_IMMUTABLE。 在31中,必须指定MUTABLE或IMMUTABLE,否则不能创建PendingIntent
我是一名优秀的程序员,十分优秀!