使用 bluebird 库取消承诺
Promise cancellation with bluebird library
我正在学习这个 bluebird promises 库。我创建了非常简单的 express 应用程序,只有一个文件和一条路线 - 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 包,然后我按照他们的建议设置 bluebird 配置 here(因为默认情况下禁用取消)。
然后我有了 foo 函数,里面有 bluebird promise。我之前提到的间隔有这种逻辑 - 索引号正在递增,当它是 5
时,间隔最终将解决承诺。
但在此之前,在我的 /test
路线中我有超时,应该在 3 秒后取消这个承诺。
所以预期的输出是:
in interval, index: 1
in interval, index: 2
in interval, index: 3
Completed
但这实际上不起作用并给我错误,它不知道取消方法是什么:
C:\Users\Admin\Documents\cancellationPromise\bluebirdp\server.js:35
foo.cancel();
^
TypeError: foo.cancel is not a function
编辑
我已将 /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');
});
所以现在我正在调用取消返回的承诺。现在的行为是它在 55 毫秒后给出响应,然后每秒 console.log 不停止在 3:
bluebird 是否可以取消 promise,包括循环、间隔和其他嵌套的 promise?
您取消了 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);
});
});
};
我正在学习这个 bluebird promises 库。我创建了非常简单的 express 应用程序,只有一个文件和一条路线 - 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 包,然后我按照他们的建议设置 bluebird 配置 here(因为默认情况下禁用取消)。
然后我有了 foo 函数,里面有 bluebird promise。我之前提到的间隔有这种逻辑 - 索引号正在递增,当它是 5
时,间隔最终将解决承诺。
但在此之前,在我的 /test
路线中我有超时,应该在 3 秒后取消这个承诺。
所以预期的输出是:
in interval, index: 1
in interval, index: 2
in interval, index: 3
Completed
但这实际上不起作用并给我错误,它不知道取消方法是什么:
C:\Users\Admin\Documents\cancellationPromise\bluebirdp\server.js:35
foo.cancel(); ^
TypeError: foo.cancel is not a function
编辑
我已将 /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');
});
所以现在我正在调用取消返回的承诺。现在的行为是它在 55 毫秒后给出响应,然后每秒 console.log 不停止在 3:
bluebird 是否可以取消 promise,包括循环、间隔和其他嵌套的 promise?
您取消了 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);
});
});
};