gpt4 book ai didi

javascript - bluebird.js 然后函数不触发

转载 作者:搜寻专家 更新时间:2023-11-01 00:40:14 34 4
gpt4 key购买 nike

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

最佳答案

bluebird 中的

.done 是终止一条链,不要试图向它传递任何东西。事实上——除非在特殊情况下,否则根本不使用它可能是个好主意。

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

关于javascript - bluebird.js 然后函数不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37373434/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com