我正在学习这个蓝鸟诺言图书馆。我创建了一个非常简单的快速应用程序,它只有一个文件和一条路由-GET /test
。
基本上我的场景是我有一个承诺,里面有间隔,并在几个间隔“循环”后解决。间隔每1秒钟工作一次,在5次之后,我清除了间隔并解决了允诺。
但是在我从间隔中解析承诺之前,我有超时,应该在3秒后取消此承诺,因此停止间隔。
我的代码是:
const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');
const Promise = require('bluebird');
Promise.config({
warnings: true,
longStackTraces: true,
cancellation: true,
monitoring: true
});
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));
//promise
const foo = () => {
return new Promise((resolve, reject) => {
let index = 0;
const intervalId = setInterval(() => {
index++;
console.log('in interval, index: ', index);
if(index === 5) {
clearInterval(intervalId);
resolve();
}
}, 1000);
});
};
//test route here
app.get('/test', async(req, res) => {
setTimeout(() => {
foo.cancel();
}, 3000);
try {
await foo();
} catch (e) {
console.error(e);
}
res.send('Completed');
});
app.listen(5000, () => {
console.log('Listen on port: ', 5000)
});
因此,我首先需要Express和Node程序包,然后根据他们的建议here设置bluebird的配置(因为默认情况下取消功能是禁用的。)
然后我有我的foo函数,里面有bluebird promise。我之前提到过,这种间隔是逻辑的-索引号在递增,当间隔为5
时,索引将最终解决promise。
但是在此之前,在我的/test
路由中,我有超时,应该在3秒后取消此承诺。
所以预期的输出是:
间隔,索引:1
间隔,索引:2
间隔,索引:3
已完成
但这实际上不起作用,并给我一个错误,它不知道取消方法是什么:
C:\ Users \ Admin \ Documents \ cancellationPromise \ bluebirdp \ server.js:35
foo.cancel(); ^
TypeError:foo.cancel不是函数
编辑
我已将/test
的路线更改为此:
app.get('/test', async(req, res) => {
let searchPromise = Promise.resolve();
searchPromise = foo()
.then(function() {
console.log('not canceled')
})
.catch(function(e) {
console.log(e);
})
.finally(function() {
if (!searchPromise.isCancelled()) {}
});
setTimeout(() => {
searchPromise.cancel();
}, 3000);
res.send('Completed');
});
所以现在我在返回的promise上调用cancel。现在的行为是它在55毫秒后给出响应,然后console.log每秒不停止在3:
bluebird是否可以取消其中包括循环,间隔和其他嵌套promise的promise?
答案 0 :(得分:3)
您取消了Promise,但是您从未清除间隔。这两件事在您的代码中未正确链接。它应该看起来像这样:
const foo = () => {
return new Promise((resolve, reject, onCancel) => {
let index = 0;
const intervalId = setInterval(() => {
index++;
console.log('in interval, index: ', index);
if(index === 5) {
clearInterval(intervalId);
resolve();
}
}, 1000);
onCancel(() => {
clearInterval(intervalId);
});
});
};