如何在JavaScript中的.forEach()遍历结束之后执行函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在JavaScript中的.forEach()遍历结束之后执行函数相关的知识,希望对你有一定的参考价值。
如何监听.forEach()是否执行完成
javascript提供了setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,因此延迟1秒后执行一个函数可以如下代码实现:setTimeout("fun()",1000); // fun()是自定义函数
下面实例演示:打开页面后倒计时3秒,然后弹出对话框
1、html结构
<div id="test">3</div>
2、javascript代码
function fun(n)
if(n>0)
n--;
document.getElementById("test").innerHTML = n;
setTimeout("fun("+n+")",1000)
else
alert("时间到!!");
window.onload = function()
setTimeout("fun(3)",1000)
参考技术A 通过判断index呗!
如何在 ForEach 循环之后保留对象变量更改。 Javascript
【中文标题】如何在 ForEach 循环之后保留对象变量更改。 Javascript【英文标题】:How to make object variable changes remain after ForEach loop. Javascript 【发布时间】:2016-12-04 19:05:12 【问题描述】:我正在尝试使用 NodeJS 中的 mongoose 在我的 MongoDB 数据库中生成一个 Data 对象。
这是sn-p的代码:
console.log(RecipeData.ingredients);
RecipeData.spices.forEach(function(spice)
module.exports.findSpiceByName(spice, function(err, res)
if (err)
return callback(err);
RecipeData.ingredients.push(res._id);
return callback(null, RecipeData);
);
);
console.log(RecipeData.ingredients);
基本上,我的 RecipeData 是一个具有一些属性的对象。在这种情况下,主要是香料和配料。这两个都是字符串列表。
我想检查 RecipeData.spice: 如果列表中有一个元素:(该元素将是香料的名称) 我想在我的 Spices Collection 中找到与该名称关联的香料,并将其 _id 永久添加到我的 RecipeData.ingredients 中在我用来测试此代码的示例中,console.log 的输出不应该相同。
知道为什么变量 RecipeData.ingredients 在 ForEach 循环之外没有改变吗?
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:听起来像是一个异步编程问题。虽然您没有发布源代码,但我假设 module.exports.findSpiceByName
是异步的,而 forEach
不是,所以 forEach
完成并且您的第二个 console.log
在您的 findSpiceByName
调用有时间完成之前运行.
解决此问题的一种方法是使用Promises,然后等待所有这些都完成,然后再尝试检查成分:
var spicePromises = RecipeData.spices.map(function(spice)
return new Promise(function(resolve, reject)
module.exports.findSpiceByName(spice, function(err, res)
if (err)
return reject(err);
resolve(res._id);
);
);
);
Promise.all(spicePromises).then(function(ingredients)
Recipe.ingredients = ingredients;
console.log(RecipeData.ingredients);
);
【讨论】:
这实际上是绝对正确的。这些console.logs
在findSpiceByName
之前运行。我怎样才能解决这个问题?尽管不管控制台日志如何,我确信变量不会改变,因为我稍后会尝试将数据对象添加到集合中,但它没有根据需要进行更新。
更新了我的答案,并举例说明了如何解决此问题
这并没有太大帮助,因为同样的事情一直在发生。所以为了避免这个问题,我在集合已经在数据库中之后更改了数据。这样我就可以在发生更改时直接更新数据库。不过感谢您的帮助。 :)以上是关于如何在JavaScript中的.forEach()遍历结束之后执行函数的主要内容,如果未能解决你的问题,请参考以下文章
@foreach 循环中的多种形式。如何使用 javascript 异步提交一个。 C# 核心剃刀
如何在 ForEach 循环之后保留对象变量更改。 Javascript
转到 JavaScript forEach 循环中的“下一个”迭代 [重复]