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 - 它让它在回调之后传递了一个额外的参数(你手动传递的)。这有效地使承诺永远悬而未决。