gpt4 book ai didi

javascript - 将 then 的值保存在 Promise 外部的变量中

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:12 42 4
gpt4 key购买 nike

我对 Promise 的概念相当陌生,我正在尝试了解范围是如何工作的。我基本上试图将 then() 内部的值存储到 Promise

外部的变量中

下面是我用 Nodejs (Express) 编写的一个简单函数,使用 Sequelize 在数据库上运行查询。

exports.getTest = (req, res, next) => {
var categories = [];
var names = ['Category 1', 'Category 2', 'Category 3', 'Category 4'];
for (var i = 0; i < names.length; i++) {
model.Category.findOne({
where: {
name: names[i]
},
attributes: ['id']
}).then(id => {
categories.push(
{
category_id: id.id
});
});
}
res.json(categories);
}

在那之后我还有其他逻辑要运行,并且我有一个围绕 Promise 的 for 循环。因此,我无法在 then 中运行下一个逻辑,否则由于 for 循环,我将让它运行多次。我需要填充数组 categories 以便在下一个操作中使用它。

目前,我的回复 (res.json(categories)) 是 []

如有任何帮助,我们将不胜感激。

PS:我知道这是一个常见的话题,但正如我所提到的,我对此还很陌生,其他答案不适合我的场景,让我更加困惑。

提前致谢!

最佳答案

就您而言,categories 将始终返回 [],因为您在返回响应之前不会等待所有 promise 完成。 For 循环在继续下一次迭代之前不会等待异步操作完成。因此循环结束,并在其中任何一个完成之前返回响应。

您应该将它们推送到一个数组,而不是在 for 循环中调用 Promise,然后将其传递给 Promise.all() 函数。

它应该是这样的

exports.getTest = () => {
var categories = [];
var names = ['Category 1', 'Category 2', 'Category 3', 'Category 4'];
var promiseArray = [];
for (var i = 0; i < names.length; i++) {
promiseArray.push(
model.Category.findOne({
where: {
name: names[i]
},
attributes: ['id']
}).then(id => {
categories.push(
{
category_id: id.id
});
});
)
}

return Promise.all(promiseArr)
}

getTest() 现在返回一个 Promise,因此可以像这样调用

getTest()
.then(data => {
// data will be an array of promise responses
}).catch(err => {
console.log(err);
})

关于javascript - 将 then 的值保存在 Promise 外部的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347636/

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