【发布时间】:2016-12-08 10:14:29
【问题描述】:
我正在尝试使用 promise 和 setTimeout 为异步函数实现超时。我想运行一个异步操作,如果它在一定时间内没有完成,就会抛出一个错误。目前,这就是我所拥有的:(其中一些在 stackoverflow 上找到)
function someOperation(cb) {
setTimeout(function() {
cb(null, 'Done');
}, 2000);
}
var p = new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error('Operation timed out'));
}, 100);
someOperation(function(err, res) {
if (err) reject(err);
else resolve(res);
});
});
p.then(function(res) {
console.log(res);
}, function(err) {
console.log("Throwing error...")
throw err;
});
但是抛出错误时程序并没有停止。谁能告诉我为什么,如果有更简单的方法可以做到这一点?我会非常感激。
编辑:现在尝试第一次使用 bluebird,它给出了 someOperationPromised.timeout 不是一个函数。我这样做对吗?
var Promise = require("bluebird");
function someOperation(cb) {
setTimeout(function() {
cb('', 'Done');
}, 2000);
}
var someOperationPromised = Promise.promisify(someOperation);
someOperationPromised.timeout(1).then(function (){
console.log("Finished!");
}).catch(Promise.TimeoutError, function (err) {
throw err;
});
【问题讨论】:
-
"程序没有停止" - 你的意思是什么?您希望取消 2 秒的操作吗?不,你必须明确地这样做。
-
您必须实际调用
someOperationPromised(),并在其后加上括号。 -
" "程序没有停止" - 你的意思是什么?" 是一个非常活泼的问题。一旦 [[PromiseStatus]] 设置为
rejected之后的决议不会对承诺状态产生任何影响。与此同时,您的someOperation函数将运行,但是由于您需要解析它的结果并在当时的onfulfillment回调中使用它,它不会产生任何结果,因为不会调用onfulfillment回调。这就是事情在 Promise 中被取消的方式。
标签: javascript node.js promise cancellation