【发布时间】:2018-10-02 03:06:26
【问题描述】:
这是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', '196', '197',
“198”、“199”、“200”、“201”、“202”、“207”、“208”、“209”、 '210'、'211'、'212'、'213'、'214'、'215'、'216'、'217'、 '218' ] //这是我控制台日志messageId的时候4 号房间的消息 => 未定义 //这是我控制台记录结果的时候
【问题讨论】:
-
这些对
Promise.resolve或Promise.reject的调用都没有必要或有用。 -
而且
Promise.all()似乎也没有必要。 -
最后一个
.then()返回未定义的console.log()的值。 -
然而,尽管如此,这可能不是问题所在。我们需要查看
keysAsync和smembersAsync的(MCVE 版本)。请使用 minimal reproducible example 来更新您的问题,以展示问题,最好是使用 Stack Snippets([<>]工具栏按钮;here's how to do one)可运行。 -
@JJJ:是的。我认为 OP 提到的 undefined 是它记录的那个,但是......
标签: javascript promise