Возвращает Promise.all не выполняет предоставленные обещания - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время у меня возникла проблема с возвратом Promise.all() из блока then().

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

const NUMBER_OF_ITEMS_PER_BATCH = 25;

const createBatches = (items) => {
    // function that creates all the batches
}

function getPromisesArray (items) {
    let batches = createBatches(items);
    let promiseArr = [];
    for(batch of batches) {
        categoriesProductsBatchWriteParams.RequestItems[categoriesProductsTable] = batch;
        promiseArr.push(dynamodb.batchWriteItem(categoriesProductsBatchWriteParams).promise)
    }
    return promiseArr;
}

// deleting an item from the first table
dynamodb.deleteItem(shopsCategoriesParams).promise()
// deleting an item from the second table
.then(() => dynamodb.deleteItem(categoriesTableParams).promise())
//querying the third table to get all the items that have a certain category id
.then(() => dynamodb.query(categoriesProductsQueryParams).promise())
.then(result => {
    if(result.Count > NUMBER_OF_ITEMS_PER_BATCH) {
        // deleting all those items with batchWrite
        return Promise.all(getPromisesArray(result.Items));
    } else {
        categoriesProductsBatchWriteParams.RequestItems[categoriesProductsTable] = buildArrayForBatchWriteDelete(result.Items);
        return dynamodb.batchWriteItem(categoriesProductsBatchWriteParams).promise()
    }
})
.then(result => {
    // this console logs [[Function: promise]]
    console.log(result);
    callback(null, 'categories were deleted successfully')
})
.catch(err => {
    console.log(err);
    callback(`Error: ${err}`);
})

У меня в настоящее время есть три разные таблицы в DynamoDB, и я должен последовательно удалять элементы из этих таблиц. В одной таблице хранятся отношения между категориями и магазинами, в одной хранятся категории и, наконец, в третьей таблице хранятся отношения между категориями и товарами. Итак, цель этой функции - удалить категорию. Поэтому мне нужно удалить отношение в Shops_Categories_Table (один-к-одному), после чего я удаляю категорию в таблице категорий и, наконец, я удаляю отношение между категориями и продуктами (один-ко-многим) в третьей таблице. Я запрашиваю Cateogries_Products_Table, используя ключ раздела categoryId, чтобы получить все продукты, относящиеся к этой категории. Наконец, я удаляю все продукты, используя метод динамод batchwriteItem.

Таким образом, проблема заключается в следующем: batchwriteItem может удалять не более 25 элементов одновременно, поэтому я создаю пакеты, содержащие каждые 25 элементов. Это делается с помощью функции createBatches, которая работает как задумано. Затем я создаю массив, в котором хранится количество dynamodb.batchwrite(params).promise обещаний. Я передаю этот массив обещаний методу Promise.all() и возвращаю его из блока then. Но почему-то обещания не выполняются, а вместо этого возвращаются, а затем консольные журналы [[Function: promise]]. Я попытался использовать свой собственный Promise, сохранил его в массиве и передал его в Promise.all(), который работал нормально. По какой-то причине эти обещания динамодба не выполняются.

1 Ответ

0 голосов
/ 01 мая 2018

Похоже, что вы создавали массив методов, а не массив обещаний, потому что вы помещаете .promise в массив вместо .promise().

Изменить это:

promiseArr.push(dynamodb.batchWriteItem(categoriesProductsBatchWriteParams).promise)

к этому:

promiseArr.push(dynamodb.batchWriteItem(categoriesProductsBatchWriteParams).promise())


К вашему сведению, обещания не выполняются, так что это не совсем подходящая фраза для использования в вашем описании и названии. Обещание - это просто инструмент для мониторинга асинхронной операции, которая уже была выполнена или инициирована другим кодом.

...