NodeJs/Bluebird - 不断收到未处理的拒绝错误
NodeJs/Bluebird - keep getting Unhandled rejection Error
正在构建一个监听 TCP 连接 > 发送命令 > 监听事件的守护进程..
所以我决定使用 bluebird 来摆脱所有的回调。但是我遇到了一个问题......我似乎无法捕捉到被拒绝的错误......我不知道我的代码出了什么问题
承诺:
function exec(cmd, params, options) {
return new Promise(function(resolve, reject) {
server.send(cmd, params || {}, options || [], function (err, res, rawRes) {
if (err) reject(err.msg);
resolve(res);
});
});
}
执行:
exec("login", {
// lOGIN
client_login_name: conf.user,
client_login_password: conf.pass
}).then(exec("use", {
// SELECT SERVER
sid: 4
})).then(exec("clientupdate", {
// CHANGE NICKNAME
client_nickname: conf.nick
})).catch(function (err) {
log.error(err);
});
错误(服务器不是运行)是reject(err.msg)
中的错误:
Unhandled rejection Error: server is not running
at Object.ensureErrorObject (D:\DEV\node\a90s\node_modules\bluebird\js\main\util.js:261:20)
at Promise._rejectCallback (D:\DEV\node\a90s\node_modules\bluebird\js\main\promise.js:465:22)
at D:\DEV\node\a90s\node_modules\bluebird\js\main\promise.js:482:17
at Object.cb (D:\DEV\node\a90s\modules\ts3interface.js:20:26)
at LineInputStream.<anonymous> (D:\DEV\node\a90s\node_modules\node-teamspeak\index.js:170:47)
at LineInputStream.emit (events.js:107:17)
at LineInputStream._events.line (D:\DEV\node\a90s\node_modules\node-teamspeak\node_modules\line-input-stream\lib\line-input-stream.js:8:8)
at Array.forEach (native)
at Socket.<anonymous> (D:\DEV\node\a90s\node_modules\node-teamspeak\node_modules\line-input-stream\lib\line-input-stream.js:36:9)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at Socket.Readable.push (_stream_readable.js:126:10)
at TCP.onread (net.js:538:20)
提前致谢:)
在您的第一个代码示例中,您同时执行了 reject
和 resolve
。这两个函数都是 运行,我相信它们会导致您所看到的错误。
将其更改为类似这样的内容,它应该可以工作。
if (err) {
reject(err);
} else {
resolve(thing);
}
试试这个,让我们知道它是如何工作的。
您必须将回调传递给 .then
,而不是承诺(您的 exec
调用 return)。
exec("login", {
// lOGIN
client_login_name: conf.user,
client_login_password: conf.pass
}).then(function(loginresult) {
// SELECT SERVER
return exec("use", {
sid: 4
});
}).then(function(selectresult) {
// CHANGE NICKNAME
return exec("clientupdate", {
client_nickname: conf.nick
});
}).catch(function (err) {
log.error(err);
});
正在构建一个监听 TCP 连接 > 发送命令 > 监听事件的守护进程..
所以我决定使用 bluebird 来摆脱所有的回调。但是我遇到了一个问题......我似乎无法捕捉到被拒绝的错误......我不知道我的代码出了什么问题
承诺:
function exec(cmd, params, options) {
return new Promise(function(resolve, reject) {
server.send(cmd, params || {}, options || [], function (err, res, rawRes) {
if (err) reject(err.msg);
resolve(res);
});
});
}
执行:
exec("login", {
// lOGIN
client_login_name: conf.user,
client_login_password: conf.pass
}).then(exec("use", {
// SELECT SERVER
sid: 4
})).then(exec("clientupdate", {
// CHANGE NICKNAME
client_nickname: conf.nick
})).catch(function (err) {
log.error(err);
});
错误(服务器不是运行)是reject(err.msg)
中的错误:
Unhandled rejection Error: server is not running
at Object.ensureErrorObject (D:\DEV\node\a90s\node_modules\bluebird\js\main\util.js:261:20)
at Promise._rejectCallback (D:\DEV\node\a90s\node_modules\bluebird\js\main\promise.js:465:22)
at D:\DEV\node\a90s\node_modules\bluebird\js\main\promise.js:482:17
at Object.cb (D:\DEV\node\a90s\modules\ts3interface.js:20:26)
at LineInputStream.<anonymous> (D:\DEV\node\a90s\node_modules\node-teamspeak\index.js:170:47)
at LineInputStream.emit (events.js:107:17)
at LineInputStream._events.line (D:\DEV\node\a90s\node_modules\node-teamspeak\node_modules\line-input-stream\lib\line-input-stream.js:8:8)
at Array.forEach (native)
at Socket.<anonymous> (D:\DEV\node\a90s\node_modules\node-teamspeak\node_modules\line-input-stream\lib\line-input-stream.js:36:9)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at Socket.Readable.push (_stream_readable.js:126:10)
at TCP.onread (net.js:538:20)
提前致谢:)
在您的第一个代码示例中,您同时执行了 reject
和 resolve
。这两个函数都是 运行,我相信它们会导致您所看到的错误。
将其更改为类似这样的内容,它应该可以工作。
if (err) {
reject(err);
} else {
resolve(thing);
}
试试这个,让我们知道它是如何工作的。
您必须将回调传递给 .then
,而不是承诺(您的 exec
调用 return)。
exec("login", {
// lOGIN
client_login_name: conf.user,
client_login_password: conf.pass
}).then(function(loginresult) {
// SELECT SERVER
return exec("use", {
sid: 4
});
}).then(function(selectresult) {
// CHANGE NICKNAME
return exec("clientupdate", {
client_nickname: conf.nick
});
}).catch(function (err) {
log.error(err);
});