【发布时间】:2016-05-18 15:38:46
【问题描述】:
我正在使用以下代码,它工作正常,但问题是当我收到错误时,我希望它停止所有其他承诺。例如,如果 chi.getCommand(val1, val2) 将发送拒绝并且我得到了异常捕获,我想取消对 chss.exe 和 app.getStatus(12); 的承诺,我该如何实现?
var start = Promise.all([
chi.getCommand(val1, val2),
chi.findAndUpdateCustomer()
]).spread(function (command, customer) {
return chss.exe(runnableDoc, command, customer)
.delay(10)
.then(function (val) {
if (val) console.log(val);
return app.getStatus(12);
});
}).catch(function (err) {
// catch and handle errors and when it come to here I want it to stops all the chain above
});
这是get命令的简写代码:
function getCommand(method, cmd) {
return new Promise(function (resolve, reject) {
...
child.stderr.on('data', function (data) {
console.log('stderr: here!' + data);
reject(data);
});
}
控制台日志 stderr: here! 被打印,所以解析被调用!
更新1
停止 getStatus 的唯一方法是当我输入 process.exit(1) 但这会杀死所有进程,我只想停止函数 getCommand 的所有链,以防我 到达 catch 块强>,
- 有什么办法吗?
- 是蓝鸟的错误吗?我使用“蓝鸟”:“2.9.34”
函数getCommand(方法,cmd){ return new Promise(function (resolve, reject) {
var spawn = require('child_process').spawn;
var ls = spawn("cmdbug",["/c","npm install express --save"]);
ls.on('error', function (err) {
console.log(err);
reject(err);
});
我得到的错误是
{ [错误:spawn cmdr ENOENT] 代码:'ENOENT', 错误号:'ENOENT', 系统调用:'spawn cmdbug', 路径:'cmdr', spawnargs: ['/g', 'npm install express --save'] } { [错误:产生 cmdbug ENOENT] 代码:'ENOENT', 错误号:'ENOENT', 系统调用:'spawn cmdbug', 路径:'cmdr', spawnargs: ['/g', 'npm install express --save'] } 子进程失败,代码 -4058
getStatus 的进程仍在写入控制台。
我使用而不是用于测试的代码是:
getCommand 是引发错误的函数!
var start= function () {
return new Promise.all([
childP.getChildProcessCommand(val1, val2),
childP.findAndUpdateCustomer()
]).spread(function (cmd, updated) {
//Execute child process
return Promise.all([
childP.getCommand('spawn', cmd),
app.getStatus(51000,10,1);
]).catch(function (err) {
// catch and handle errors
console.log("An error occur: " + err);
return;
})
}).catch(function (err) {
// catch and handle errors
console.log("An error occur: " + err);
return;
})
}();
查询状态代码为:
// Returns a promise that resolves when the port is open
checkPortStatus: function(port, host){
return new Promise((resolve, reject) => {
portscanner.checkPortStatus(port, host, function(error, status) {
if(error)
reject(error);
else if(status === 'open')
resolve(status);
else
reject(new Error('Port is not open'));
});
});
},
// THE API function
getStatus: function(port, retriesLeft) {
const TIME_BETWEEN_CHECKS = 1000;
const HOST = '127.0.0.1';
const RETRIES = 20;
retriesLeft = retriesLeft === void 0 ? RETRIES : retriesLeft;
if(!port) throw new Error('Port is required');
if(retriesLeft === 0) Promise.reject('Timed Out');
return new Promise((resolve, reject) => {
// If it rejects, we do added work.
this.checkPortStatus(port, host).then(resolve, error => {
console.log("Waiting for port " + port + " attempt: " + retry);
setTimeout(() => {
this.getStatus(port, retriesLeft - 1).then(resolve, reject);
}, TIME_BETWEEN_CHECKS);
});
});
}
我在控制台中看到了错误,仍然看到控制台日志 以下为 10 次尝试。 console.log("等待端口" + 端口 + " 尝试:" + 重试);
更新2 当尝试更改第二个选项中的@artur 建议时,我在递归调用中遇到错误,错误是:
TypeError: 无法读取未定义的属性 'then'
这是我尝试过的:
getStatus: function(port, retriesLeft) {
const TIME_BETWEEN_CHECKS = 1000;
const HOST = '127.0.0.1';
const RETRIES = 20;
retriesLeft = retriesLeft === void 0 ? RETRIES : retriesLeft;
if(!port) throw new Error('Port is required');
if(retriesLeft === 0) Promise.reject('Timed Out');
var promise = new Promise((resolve, reject) => {
// If it rejects, we do added work.
this.checkPortStatus(port, host).then(resolve, error => {
console.log("Waiting for port " + port + " attempt: " + retry);
setTimeout(() => {
//The error in the following recursive call
this.getStatus(port, retriesLeft - 1).then(resolve, reject);
}, TIME_BETWEEN_CHECKS);
}).catch(function (error) {
return reject(error);
});
return {
promise:promise,
cancel: function() {
console.log('cancelling');
clearTimeout(token);
}
}
});
});
}
【问题讨论】:
-
Promise.all已经这样做了。 bluebirdjs.com/docs/api/promise.all.html -
@Mark:我很确定不是。也许它是从其他地方调用的?
-
@Bergi - 请查看我的代码更新
-
@Bergi - 所以在这种情况下,我看到了console.log,所以承诺被拒绝(后行),我看到 getStatus 仍然有效,你建议做什么来克服这个?
-
你确定在拒绝承诺之前没有履行/解决吗?
标签: javascript node.js promise bluebird