我試圖編寫一個函數,直到函數內部的Promise解析完成才返回它的值。這是我想要做的一個簡單的例子。如何等待直到承諾解決才返回值?
'use strict';
function get(db, id) {
let p = db.command('GET', 'group:${id}');
p.then(g => {
g.memberNames = [];
g.members.forEach(id => {
User.get(db, id)
.then(profile => g.memberNames.push(profile.name))
.catch(err => reject(err));
});
return g;
});
}
這是一個函數,它請求一個組ID並返回該組的數據。一路上,它也將用戶的姓名放入數據結構中以顯示他們的姓名,而不是他們的用戶ID。我的問題是,這是異步運行,並會跳過.then回調。當它返回g時,沒有任何回調被調用,並且g.memberNames
仍然是空的。有沒有辦法讓函數等待返回g直到所有的回調被調用?
我見過很多關於等待的東西。這裏有必要嗎?將其他庫添加到我的項目是非常不希望的。
我認爲要做到這一點的首選方法是將回調傳遞給你的函數,這將被稱爲準備時。 –
放棄同步返回值的想法會更好。您的數據庫API暴露了承諾,因此請使用它們,並且不要嘗試將其變爲同步。你可以寫任何你想堅持異步/承諾模式的東西。這是改變你的觀點的問題。 – trincot