У меня есть объект с некоторыми идентификаторами, которые мне нужно заменить их связанными объектами, извлекая их на разных конечных точках.
{
user: 123456
items: [
1234,
4321,
]
}
и я хочу получить его, где a - конечная точка GET/user
для userId и GET/item
для каждого из идентификаторов элементов. Я хочу, чтобы полный объект возвращался как:
{
user: { ... }
items: [
{ ... }
{ ... }
]
}
Все мои функции пользователя и элемента работают и используют async fetch, поэтому я думаю, что хочу что-то по строкам o:
const fillIn = async data => {
return Promise.all(
data.map(async obj => {
const userId = obj.userId;
const itemIds = obj.items
return Promise.all([
getUser(creatorId),
Promise.all(itemIds.map(item => getItem(item)))
]);
})
);
};
Мой вопрос - это то, что обещает. Все вернутся и когда оно вернет его? Я все время возвращаю функции обратно, но я думал, что все дело в том, чтобы решить все обещания !?
Функция, в которой вы нуждаетесь, возвращает обещание, которое выполняется с "заполненным" объектом. Это обещание действительно представляет собой набор обещаний: один для пользователя и массив для каждого элемента в элементах...
function fillIn(object) {
let filledInObject = { user:null, items:[] };
let promises = object.items.map(i => {
return getItem(i).then(item => filledInObject.items.push(item));
});
let userPromise = getUser(object.user).then(user => {
filledInObject.user = user;
});
promises.push(userPromise);
return Promise.all(promises);
}
Можно также представить более общее решение, в котором имена свойств сопоставляются с геттерами в каком-либо конфигурационном объекте:
// getUser and getItem are assumed as above
// add a plural form for getItems
// our getters will be indexed like this: { user:getUser, items:getItems }
function getItems(array) {
let promises = array.map(i => getItem(i));
return Promise.all(promises);
}
Теперь, общий наполнитель-внутренний...
function fillIn(object, getters) {
let filledInObject = {};
let promises = Object.keys(object).map(key => {
let getter = getters[key]; // lookup a promise-returning function for the key
// call it with the param in the object, use the result to fill-in the target object
return getter(object[key]).then(result => {
filledInObject[key] = result;
});
});
return Promise.all(promises);
}
Назовите это так:
const getters = { user:getUser, items:getItems }
let opObject = { user: 123456, items: [ 1234, 4321 ] };
fillIn(opObject, getters).then(filledInObject => {
console.log(filledInObject);
})
data
иgetUser
/getItem
Promise.all
возвращает обещание. Из которого вы можете вызвать.then()
и другие методы