bluebird.js then function not firing
bluebird.js then function not firing
NodeJS 的新手,开始了解 promises。
在下面这个简单的例子中,我不明白为什么 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
在 bluebird 中是终止一条链,不要试图将任何东西传递给它。事实上——除非在特殊情况下,否则根本不使用它可能是个好主意。
Promise fulfillment 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 - 它让它在回调之后传递了一个额外的参数(你手动传递的)。这有效地使承诺永远悬而未决。
NodeJS 的新手,开始了解 promises。 在下面这个简单的例子中,我不明白为什么 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
在 bluebird 中是终止一条链,不要试图将任何东西传递给它。事实上——除非在特殊情况下,否则根本不使用它可能是个好主意。
Promise fulfillment 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 - 它让它在回调之后传递了一个额外的参数(你手动传递的)。这有效地使承诺永远悬而未决。