NodeJS的新手,让我了解承诺。 在下面这个简单的例子中,我不明白为什么then函数不会触发。数据变量已成功设置,但在此之后不会继续。
我做错了什么?
var AWS = require('aws-sdk');
var Promise = require('bluebird');
var docClient = new AWS.DynamoDB.DocumentClient();
Promise.promisifyAll(Object.getPrototypeOf(docClient));
var tableQuery = {
TableName : "Info",
KeyConditionExpression: "#rt = :rt",
ExpressionAttributeNames: { "#rt": "Type" },
ExpressionAttributeValues: { ":rt": "Owner" }
}
docClient.queryAsync(tableQuery, function (err, data) {
return data;
}).then(function(data) {
//doesn't get here...
return data.Items;
}).done(function (item) {
console.log("Done." + item);
});
答案 0 :(得分:3)
.done
是终止链,不要尝试传递任何东西。事实上 - 除非在特殊情况下,否则根本不使用它可能是个好主意。
承诺履行then
处理程序不处理错误 - .catch
可以找到错误。方法是不将错误与值混淆 - 因此,获取数据的函数应该使用then
处理程序中的数据参数而不是(err, data)
:
const AWS = require('aws-sdk'); // prefer const in node
const Promise = require('bluebird');
const docClient = new AWS.DynamoDB.DocumentClient();
Promise.promisifyAll(Object.getPrototypeOf(docClient));
var tableQuery = {
TableName : "Info",
KeyConditionExpression: "#rt = :rt",
ExpressionAttributeNames: { "#rt": "Type" },
ExpressionAttributeValues: { ":rt": "Owner" }
}
docClient.queryAsync(tableQuery).then(data => data.Items).then(items => {
console.log("Done." + items);
});
您的代码失败,因为它混淆了bluebird - 它使得它在回调后传递了一个额外的参数(您手动传递)。这有效地使承诺永远悬而未决。