簡體   English   中英

Promise.resolve返回未定義

[英]Promise.resolve returns Undefined

這是多重承諾的延續-在哪里解決? 我將相同的代碼用於不同的功能。

但是,這一次Promise.resolve返回未定義。

結果感謝多個人指出錯誤。 我意識到自己提交的代碼中存在多個錯誤。

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'] //這是我控制台日志messagesId的時間

4號會議室中的消息=> undefined //這是我控制台日志結果的時間

console.log()返回undefined ,這是錯誤的。 &&是短路運算符,僅當第一個表達式為真時才計算第二個表達式。 因此,它永遠不會執行Promise.resolve(messagesId)

代替&& ,使用逗號運算符。 它計算兩個表達式並返回第二個表達式。

    .then(messagesId => (console.log(messagesId), Promise.resolve(messagesId)))

如前所述,您將獲得console.log(messagesId)的返回值作為解析值,由於&&工作方式以及console.log()返回方式,該值undefined

但是,由於您實際上要做的就是記錄結果並繼續使用相同的解析值,因此我建議一種更清潔的方法是使自己具有一些實用功能:

function log(arg) {
    console.log(arg);
    return arg;
}

然后,您可以更改此設置:

.then(messagesId => console.log(messagesId) && Promise.resolve(messagesId))

對此:

.then(log)

請注意,在.then()處理函數中,您返回的任何普通值都將成為承諾鏈的已解析值。 如果您想在promise鏈中添加另一個異步操作,也可以返回一個promise,但是如果您已經有一個值,則可以只return value; 您不需要return Promise.resolve(value); Promise.resolve() .then()處理程序內部, Promise.resolve()只是多余的,不必要的代碼-只需直接返回值即可。

Promise不會使用messageId解析,因為console.log()返回undefined

 console.log(Boolean(console.log("test"))); 

但這不是您應該更改的唯一內容,實際上,您smembersAsync()很多,因為smembersAsync()函數返回一個promise,您可以簡單地返回:

代替

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM