有没有办法告诉整个应用程序中有多少个待处理的承诺?
我正在以批处理模式将记录提供给数据库(使用sequelize)。每个插入都是一个承诺,请求的速率高于结果,因此未决承诺的数量正在增加。
对此有什么好处?等待每次插入似乎效率较低但我怀疑让未决承诺增长最终会崩溃。
到目前为止,我想知道全球有多少承诺正在等待分析增长率并研究可能的解决方案或在此处获得一些想法。
答案 0 :(得分:4)
...但我怀疑让未决承诺增长最终会崩溃。
只是因为你的内存不足或可能是因为你的续集连接器达到了无法处理大量请求的程度。但是,是的,您希望避免不断增加未完成请求的数量。
没有任何内置功能可以告诉您这一点,但您可以通过简单地跟踪来轻松了解有多少相关内容:
let outstanding = 0;
function track(p) {
++outstanding;
p.catch(e => e).then(() => {
--outstanding;
});
return p;
}
然后在调用track
时将你的续集调用包裹起来:
track(calltoSequelize(/*...*/)).then(/*...*/);
如果您使用带有finally
的promises库(或使用the proposal中的polyfill),track
可以是:
let outstanding = 0;
function track(p) {
++outstanding;
return p.finally(() => {
--outstanding;
});
}
答案 1 :(得分:0)
您可以尝试使用this来限制有效的承诺。我假设你做了一个Promise.all,你传给它的数组有多大?
TJ有一个很好的答案,但你应该重新抛出拒绝值
var trackPromise = (
outstanding => {
return {
add:p => {
outstanding++;
return p.then(x=>{
outstanding--;
return x;
})
.catch(
err=>{
outstanding--;
return Promise.reject(err);
}
);
},
count:()=>outstanding
};
}
)(0)
trackPromise.add(Promise.resolve(22))
.then(
resolve=>console.log("resolved:",resolve),
reject=>console.warn("rejected:",reject)
);
trackPromise.add(Promise.reject(0))
.then(
resolve=>console.log("resolved:",resolve),
reject=>console.warn("rejected:",reject)
);
console.log("active:",trackPromise.count())