返回Promise.all不执行提供的promises

时间:2018-05-01 05:14:10

标签: javascript node.js lambda amazon-dynamodb es6-promise

我目前在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中的关系(一对一),然后我删除类别表中的类别,最后我删除类别和产品之间的关系(一个 - 在第三个表中。我使用categoryId分区键查询Cateogries_Products_Table,以检索与该类别相关的所有产品。最后,我使用dynamodb batchwriteItem方法删除所有产品。

这里的问题如下,batchwriteItem一次最多只能删除25个项目,这就是为什么我要创建包含每个项目的批次。这是通过createBatches函数完成的,该函数按预期工作。然后我创建一个存储许多dynamodb.batchwrite(params).promise承诺的数组。我将这个promise数组传递给Promise.all()方法并从then块中返回它。但不知怎的,承诺没有被执行,而是返回,然后控制日志[[Function: promise]]。我尝试使用自己的自定义Promise,将其存储在一个数组中,然后将其传递给Promise.all(),该工作正常。无论出于何种原因,虽然那些动态的承诺不会被执行。

1 个答案:

答案 0 :(得分:2)

您似乎正在创建一系列方法,而不是一系列承诺,因为您将.promise推送到数组而不是.promise()

改变这个:

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

到此:

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

仅供参考,承诺不执行,因此在您的描述和标题中使用的确不是正确的措辞。 promise只是一种用于监视已由其他代码执行或启动的异步操作的工具。