Promise.all ([…]) заполнение объекта

1

У меня есть объект с некоторыми идентификаторами, которые мне нужно заменить их связанными объектами, извлекая их на разных конечных точках.

{
  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)))
      ]);
    })
  );
};

Мой вопрос - это то, что обещает. Все вернутся и когда оно вернет его? Я все время возвращаю функции обратно, но я думал, что все дело в том, чтобы решить все обещания !?

  • 0
    Пожалуйста, покажите полный код, включая data и getUser / getItem
  • 2
    Promise.all возвращает обещание. Из которого вы можете вызвать .then() и другие методы
Показать ещё 3 комментария
Теги:
promise

1 ответ

1
Лучший ответ

Функция, в которой вы нуждаетесь, возвращает обещание, которое выполняется с "заполненным" объектом. Это обещание действительно представляет собой набор обещаний: один для пользователя и массив для каждого элемента в элементах...

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню