我使用ES6 Promises来管理我的所有网络数据检索,在某些情况下我需要强制取消它们.
基本上这种情况是我在UI上有一个提前输入搜索,其中请求被委托给后端必须基于部分输入执行搜索.虽然此网络请求(#1)可能需要一点时间,但用户会继续键入哪个最终会触发另一个后端调用(#2)
这里#2自然优先于#1,所以我想取消Promise包装请求#1.我已经拥有数据层中所有Promise的缓存,因此我理论上可以检索它,因为我试图提交#2的Promise.
但是一旦从缓存中检索Promise,我该如何取消Promise#1?
有人可以建议一种方法吗?
如何在一定时间后超时承诺?我知道Q有一个承诺超时,但我使用的是本机NodeJS承诺而且它们没有.timeout函数.
我错过了一个或其包装不同吗?
或者,下面的实现是否有利于不吸收内存,实际上按预期工作?
我也可以以某种方式将其全局包装,以便我可以将它用于我创建的每个承诺,而不必重复setTimeout和clearTimeout代码?
function run() {
logger.info('DoNothingController working on process id {0}...'.format(process.pid));
myPromise(4000)
.then(function() {
logger.info('Successful!');
})
.catch(function(error) {
logger.error('Failed! ' + error);
});
}
function myPromise(ms) {
return new Promise(function(resolve, reject) {
var hasValueReturned;
var promiseTimeout = setTimeout(function() {
if (!hasValueReturned) {
reject('Promise timed out after ' + ms + ' ms');
}
}, ms);
// Do something, for example for testing purposes
setTimeout(function() {
resolve();
clearTimeout(promiseTimeout);
}, ms - 2000);
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
javascript 中 sleep 函数最常见的实现是在 setTimeout 解析后返回 Promise:
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
Run Code Online (Sandbox Code Playgroud)
我有带有await sleep的for循环,以防止它执行得太快,例如不要太快地请求xhr。我在其他地方还有一个 isBreak 标志来告诉我何时停止 for 循环。然而,我遇到的问题是,当我中断 for 循环时,之前的等待睡眠已经执行并阻止了 for 循环。有没有更好的方法来打破 for 循环并立即终止等待睡眠?
const items = [];
let isBreak = false; // Somewhere else in the application
for (const item of items) {
if (isBreak) break;
// Do something, like xhr request
await sleep(15000); // 15 seconds sleep
if (isBreak) break;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我提前发出信号