AWS Lambda не ожидает Promise.all () от DynamoDB - PullRequest
0 голосов
/ 31 августа 2018

Я довольно новичок в Promises на NodeJS и пытаюсь написать некоторый внутренний код в AWS Lambda для запроса таблицы DynamoDB, содержащей устройства.

Код следующий:

            var geohash = require('ngeohash');
            var AWS = require('aws-sdk');
            var documentClient = new AWS.DynamoDB.DocumentClient();

            exports.handler = (event, context, callback) => {

                if(event.params.querystring.minLat && event.params.querystring.minLon
                    && event.params.querystring.maxLat && event.params.querystring.maxLon ){

                        var bboxes = geohash.bboxes(event.params.querystring.minLat, event.params.querystring.minLon, event.params.querystring.maxLat, event.params.querystring.maxLon, 6);

                        var params = {
                            "TableName": "Devices",
                            "IndexName": "GeoIndex",
                            "KeyConditionExpression": "GeohashPrefix = :bbox",
                            "ExpressionAttributeValues": {
                                ":bbox": ""
                            },
                        };

                        var devices = [];
                        var promises = [];

                        for (var num in bboxes) {
                            params.ExpressionAttributeValues[":bbox"] = bboxes[num];
                            promises = promises.concat(documentClient.query(params, function(err, data) {
                                if (err) {
                                    console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
                                } else {
                                    console.log("Query succeeded.");
                                    devices = devices.concat(data.Items);
                                    console.log(devices);
                                }
                            }).promise())
                        }
                        Promise.all(promises).then(callback(null, devices));
                    }

                }

В данном случае происходит то, что Promise.all () на самом деле не ожидает всех обещаний, а сразу возвращается.

Что я делаю не так?

1 Ответ

0 голосов
/ 31 августа 2018

Вам нужно передать функцию в then(), а не результат функции.

Это:

Promise.all(promises).then(callback(null, devices));

должно быть больше так:

Promise.all(promises).then(() => callback(null, devices));

В первом случае callback вызывается сразу после определения обещания.

...