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);
});
.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感到困惑-它使它在回调(您手动传递的)之后传递了一个附加参数。这实际上使诺言永远悬而未决。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句