bluebird.js然后功能不解雇

时间:2016-05-22 10:56:39

标签: javascript node.js promise bluebird

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);
});

1 个答案:

答案 0 :(得分:3)

bluebird中的

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