gpt4 book ai didi

javascript - 如何迭代创建记录集合并一次呈现所有记录?

转载 作者:行者123 更新时间:2023-11-30 12:18:43 25 4
gpt4 key购买 nike

我有许多值数组从我的 View 发送到 Controller 。示例:

year: ['2015','2016','2017']
cash: ['...','...','...']
.
.
.

每个数组的第 0 个索引在现金流量数据库表中形成一条记录。第一个记录另一个,依此类推...现金流是“属性”模型中的一个集合。每当创建“属性(property)”记录时,我都需要迭代地创建这些“现金流”。

我正在使用 sails 框架。我无法迭代地创建这些记录并一次呈现所有记录。我不确定这是否需要使用异步任务来完成。

Property.create(reqParams).exec(function(err, property) {
if (err) {
...
} else {
var index = 0;
var asyncTasks = [];

for (index = 0; index < reqParams.year.length; index++) {

asyncTasks.push(function(callback) {

CashFlowProjections.create({
year: reqParams.year[index],
belongsTo: property.id,
cash: reqParams.cash[index],
...)
.exec(function(err, cashflows) {
callback(err, cashflows);
});
});
}

async.parallel(asyncTasks, function(err, results) {
if (err) {
res.handleError(0, err);
} else {
res.view('property/preview', {
cashflows: results[0],
...
});
}
});
}
}
});

但是上面的代码是错误的,因为“索引”对于所有记录最终都是相同的值并且记录创建失败。

我也尝试过不使用异步任务,但我遇到了在创建现金流记录之前执行“res.view”的问题。有人可以指导我吗?

最佳答案

问题在于变量 index 的范围。 index 的范围是从第 1 行开始的函数。asyncTasks 变成函数数组,这些函数是 closures - 它们与其封闭的函数共享变量范围。由于这些函数是异步调用的,在 for 循环结束后,index 的值为 reqParams.year.length打电话。

为了解决这个问题,你可以为每个函数创建一个单独的作用域,并在这些作用域中复制一份 index,它不会受到 index++ 的影响原始 index 的。像这样:

for (index = 0; index < reqParams.year.length; index++) {

(function(index) {
asyncTasks.push(function(callback) {

CashFlowProjections.create({
year: reqParams.year[index],
belongsTo: property.id,
cash: reqParams.cash[index],
...})
.exec(function(err, cashflows) {
callback(err, cashflows);
});
});
})(index);
}

如果这样做,实际上有两个单独的变量称为 index:

  • 原始脚本,在原始脚本的第 5 行声明并在 for 行和 })(index); 中使用。它的值从 0 开始,并在每次循环时递增。
  • 一个新的内部函数,声明于 function(index)。这会覆盖原始的,但仅限于函数定义内部。事实上,这实际上是几个独立的范围:每次通过循环时,它都会创建一个新的(匿名)函数并调用它,调用该函数会创建范围。它的值设置为循环运行时外部 index 的值,此后永远不会更改,并在 async.parallel 运行任务时使用。

因此,如果您愿意,可以重命名这两个变量之一以避免混淆。

关于javascript - 如何迭代创建记录集合并一次呈现所有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31685875/

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