Promise.resolve返回Undefined

时间:2018-04-21 16:29:36

标签: javascript promise

这是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 //这是我控制日志结果的时候

3 个答案:

答案 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)
    })