这是Multiple Promises - Where to resolve?的延续,我对不同的函数使用相同的代码。
但是,这次Promise.resolve返回undefined。
结果 多亏了多个人指出错误。代码中有多个错误,我意识到我已经提交了。
1)使用&&在非布尔运算中。
应该使用
(console.log(results) , Promise.resolve(results)
而不是
console.log(results) && Promise.resolve(results)
2)使用不需要的Promise.resolve - 只返回Async函数的结果将产生与使用Promise.resolve相同的结果。
我的最终代码。
getMessages: function (roomId) {
return keysAsync('room:'+roomId)
.then(room =>
room === '' ? Promise.reject('Invalid room Id')
: smembersAsync('room:messages:'+roomId))
.then(messagesId => { return messagesId })
.catch(err => { return err }))
}
原始问题 我使用nodejs promisify,因此我将以下声明声明为Redis的承诺
const { promisify } = require('util');
const getAsync = promisify(client.get).bind(client);
const hmsetAsync = promisify(client.hmset).bind(client);
const hsetAsync = promisify(client.hset).bind(client);
const incrAsync = promisify(client.incr).bind(client);
const smembersAsync = promisify(client.smembers).bind(client);
const keysAsync = promisify(client.keys).bind(client);
const sismemberAsync = promisify(client.sismember).bind(client);
getMessages: function (roomId) {
return keysAsync('room:'+roomId)
.then(room =>
room === '' ? Promise.reject('Invalid room Id')
: smembersAsync('room:messages:'+roomId))
.then(messagesId => console.log(messagesId) && Promise.resolve(messagesId))
.catch(err => Promise.reject(err))
},
然后我调用该函数如下
tools.getMessages('4').then((results) => {
console.log('Messages in Room 4 => ', results);
}).catch(err => console.log(err))
在我的控制台中,我可以看到以下结果
[' 191',' 192',' 193',' 194',' 195',& #39; 196',' 197',
' 198',' 199',' 200',' 201',' 202',' 207& #39;,' 208',' 209', ' 210',' 211',' 212',' 213',' 214',' 215& #39;,' 216',' 217', ' 218' ] //这是我控制日志消息的时候会议室4中的消息=> undefined //这是我控制日志结果的时候
答案 0 :(得分:2)
console.log()
返回undefined
,这是假的。 &&
是一个短路运算符,仅在第一个表达式为真时才计算第二个表达式。所以它永远不会执行Promise.resolve(messagesId)
。
使用逗号运算符代替&&
。它评估它的两个表达式并返回第二个表达式。
.then(messagesId => (console.log(messagesId), Promise.resolve(messagesId)))
答案 1 :(得分:2)
正如已经解释的那样,由于console.log(messagesId)
的工作方式和undefined
的方式,您获得&&
的返回值作为已解决的值console.log()
回报。
但是,因为,你真正想要做的就是记录结果并继续使用相同的分辨值,我建议一种更简洁的方法就是让自己成为一个小实用功能:
function log(arg) {
console.log(arg);
return arg;
}
然后,你可以改变这个:
.then(messagesId => console.log(messagesId) && Promise.resolve(messagesId))
到此:
.then(log)
请注意,在.then()
处理程序中,您返回的任何普通值都将成为promise链的已解析值。如果要在promise链中添加另一个异步操作,也可以返回一个promise,但是如果你已经有了一个值,那么你可以return value;
。你不需要return Promise.resolve(value);
。在.then()
处理程序中,Promise.resolve()
只是额外的,不必要的代码 - 只需直接返回值即可。
答案 2 :(得分:0)
承诺与messageId
无法解决,因为console.log()
会返回undefined
:
console.log(Boolean(console.log("test")));

但这不是你应该改变的唯一事情,事实上,你可以省去很多,因为smembersAsync()
函数返回一个承诺,你可以简单地返回:
而不是
return keysAsync('room:'+roomId)
.then(room =>
room === '' ? Promise.reject('Invalid room Id')
: smembersAsync('room:messages:'+roomId))
.then(messagesId => console.log(messagesId) && Promise.resolve(messagesId))
.catch(err => Promise.reject(err))
只需使用
return keysAsync('room:'+roomId)
.then(room => {
if (room === "") { Promise.reject('Invalid room Id') }
else return smembersAsync('room:messages:'+roomId)
})