我有此代码(使用Bluebird Promise):
USERS.each { |user| example.duplicate_with(user: user) }
然后我进行const promise = loadSomething(id)
.then(something => {
loadParentOfSomething(something.parentId);
return something;
});
时,promise.cancel()
被取消,但getSomething
未被取消。
是否有办法取消getSomethingParent
承诺,我也可以取消getSomething
承诺?
两个加载函数都返回一个带有HTTP请求的可取消的异步承诺,而我想取消它们的原因是因为它们有时可能需要一段时间才能加载,并且例如当用户导航(SPA)时,响应不再需要。
答案 0 :(得分:0)
我认为您实际上在寻找什么
const promise1 = loadSomething(id);
const promise2 = promise1.then(something => { return loadParentOfSomething(something.parentId); });
// ^^^^^^
promise2.catch(e => void "ignore"); // prevent unhandled rejections
然后,您可以继续使用promise1
来访问结果,也可以调用promise2.cancel()
。即使在promise1
解决之后,这种取消也是可能的。
答案 1 :(得分:-1)
将函数定义为then
回调的第二个参数。示例:
const promise = getSomething(id)
.then(something => {
getSomethingParent(something.parentId);
return something;
}, error => {
console.error(error)
});
当您致电promise.reject()
时,将不会呼叫getSomethingParent
。
Reference
答案 2 :(得分:-2)
如果您准备引用loadSomethingOfParent
的虚拟承诺,则应该可以在loadSomething
之内取消它。
// Create a dummy promise to reference `loadParentOfSomething`
var dummyPromise = Promise.resolve();
// Pass `dummyPromise` to `loadSomething`
const promise = loadSomething(id, dummyPromise).then(something => {
dummyPromise = loadParentOfSomething(something.parentId);
return something;
});
loadSomething
将需要一个onCancel
处理程序,该处理程序将在取消承诺后执行。
function loadSomething(id, promise) {
return new Promise(function(resolve, reject, onCancel) {
// Do your stuff
// The `.cancel()` handler
onCancel(function() {
promise.cancel();
});
});
}