#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))
, это в конечном итоге не приведет к выводу измененных элементов?