[英]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.