Изменить свойства объекта Javascript / node в виде списка

#javascript #node.js #amazon-dynamodb

#javascript #node.js #amazon-dynamodb

Вопрос:

Я работаю в среде serveless lambda dynamodb и не могу получить ключ к разгадке.

У меня есть функция, подобная:

 getList : () =>  {
    return new Promise(function(resolve, reject) {
        var params = {param1 : value1, param2: value2} //parameters for a DB query
        getItemsfromDB(params, function(err, data) { //get all items in a table, returns a Promise
            if (err) return reject(err); 
            data.Items.forEach ((item, index) : => { //Items constain a obejct, with list of objects, like a arraym return another Promise.
                getItemPropDetailsfromDB(item.prop1, (itemDetails) : => { //I get item by item details from another table. item.prop1 is string
                    data.Items[index].prop1 =  itemDetails; //replace string with object details
                    //log says that at this time, itemDetails are the object retrived as I want. 

                });
            })
            return resolve(data.Items) // return the initial prop1 string
    }
}
  

Я не знаю, как изменить исходный объект или вернуть новый объект. Я провожу МНОГО тестов, но не могу понять, где я ошибаюсь
Извините за мой английский и мою (возможно) неполную информацию, я не знаю, что еще нужно протестировать.

ОБНОВЛЕНИЕ наконец я решил это :

 getList : () => new Promise((resolve, reject) => {
var params = {param1 : value1, param2: value2} //parameters for a DB query
getItemsfromDB(params, (err, data) => {
    if (err) return reject(err);
    Promise.all(data.Items.map((item, index) => new Promise((resolve) =>
        getItemPropDetailsfromDB(item.prop1, (itemDetails) => {
        var newItem = data.Items[index];//map() return a new object with modifies properties, so i copy one by one
        newItem.prop1 = itemDetails;//replace prop1 

        return resolve(newItem);//return modified item
        })//this return a new object.
    ))).then((newData) => => {return resolve(newData)}) //then i retrive the new object
  })
})
  

спасибо за помощь!

Ответ №1:

То, что вы пытаетесь сделать, кажется странным и, вероятно, должно быть сделано каким-то другим способом, но попробуйте это:

 getList : () => new Promise((resolve, reject) => {
  var params = {param1 : value1, param2: value2} //parameters for a DB query
  getItemsfromDB(params, (err, data) => {
    if (err) return reject(err);
    Promise.all(data.Items.map((item, index) => new Promise((resolve) =>
      getItemPropDetailsfromDB(item.prop1, (itemDetails) => {
        data.Items[index].prop1 = itemDetails;
        resolve(itemDetails);
      })
    ))).then(() => resolve(data.Items))
  })
})
  

Также обратите getItemPropDetailsfromDB внимание, что, похоже, не вызывает его обратный вызов с помощью типичного подхода, основанного на ошибках, поэтому я понятия не имею, что произойдет, если эта функция столкнется с ошибкой (будет ли она вызывать свой обратный вызов с undefined помощью или просто не вызовет обратный вызов вообще?).

Комментарии:

1. Спасибо! На самом деле, я не делал обработчик исключений, потому что я застрял там, во всяком случае, я попробовал ваше предложение, и я получаю тот же объект, когда я регистрирую data.item перед последним разрешением. Это отличная отправная точка, я новичок в объектах Promises.

2. @Lucas так что, если вы это сделаете getList().then((items) => console.log(items)) , это в конечном итоге не приведет к выводу измененных элементов?