Возможно, вы используете Node.js 8.10, который до сих пор является последней версией Node.js, поддерживаемой AWS Lambda, в противном случае последний (4.) фрагмент кода вообще не будет работать (из-за синтаксической ошибки).
В Node.js 8.10 все перечисленные выше варианты действительны, большинство из них все еще существуют только для совместимости с более ранними версиями времени выполнения.
Первые два (1. и 2.)самые старые, и не рекомендуется больше их использовать.Функция done(err?, res?)
эквивалентна добавленной позже callback(err?, res?)
, которая часто использовалась до Node.js 8.10, и вы можете найти множество примеров кода даже в официальной документации.Это типичный обратный вызов и может использоваться в асинхронной обработке:
exports.handler = (event, context, callback) => {
var params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
s3.getObject(params, function(err, data) {
if (err) return callback(err);
callback(null, data);
});
}
Тем не менее, эта функция имеет все недостатки использования обратных вызовов в целом (Callback Hell).
Up Node.js 8.10Вы можете использовать Promises вместе с async/await
синтаксическим сахаром, что делает асинхронные вычисления похожими на синхронные.AWS JavaScript SDK добавил функцию promise()
почти ко всем функциям, ранее использовавшим обратные вызовы.Теперь вы можете написать:
exports.handler = async event => {
var params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
var data = await s3.getObject(params).promise();
// here you process the already resolved data...
return data;
// or you can omit `await` here whatsoever:
// return s3.getObject(params).promise();
}
, который производит более короткий и элегантный код, более читабельный для людей.
Конечно, в конце вы можете выбрать то, что вам нравится, просто сравните ваши примеры фрагментов...