【问题标题】:How to push items in an array inside a promise function JavaScript如何在承诺函数 JavaScript 中推送数组中的项目
【发布时间】:2019-12-13 03:17:59
【问题描述】:

我想将 Promise 函数的结果推送到一个数组中,但是该数组仍然是空的。有人可以帮忙吗This is what I would like to achieve at the end, update my ejs file from the promise function. However, nothing happens once I do this.

var Data = [];
        raw.forEach(function (host) {
            ping.promise.probe(host.ip).then(function (res) {
                if(res.alive){
                    const input = {
                        "Host": i.host,
                        "IP": i.ip,
                        "Status": "Alive",
                        "Avg": res.avg
                    }
                    Data.push(input);
                }
                else {
                    const input = {
                        "Host": i.host,
                        "IP": i.ip,
                        "Status": "Dead",
                        "Avg": res.avg
                    }
                    Data.push(input);
                }
                });
        });
        console.log(Data);

【问题讨论】:

  • Data 已填充,只是您在之前记录它。
  • 那我应该做些什么改变来保存数组中的数据呢?谢谢! @briosheje
  • 如前所述,数据已填充,您只是在填充之前记录它,您不能 将在未来中填充的日志数据。您必须在函数中移动使用Data 的代码,并在.then 回调内部 调用它。检查上面的重复链接,所有内容都在该帖子中进行了解释。
  • 我想填充数组“数据”并在其他地方使用它。怎么做?谢谢!

标签: javascript express promise ip


【解决方案1】:

它看起来像是空的,但实际上并非如此。 Promise 是异步的,这意味着当设置了 Promise 时——创建它的上下文中的代码会继续运行,并且只有在解决 Promise 时才会执行 then 子句(如果被拒绝,则执行 .catch )。

你这样做:

...promise.then( (res) => { data.push(res); } );
conosole.log(data);

但是console.log 是在promise 解决之前执行的并且then 子句被执行。 如果您将console.log(data) 移动到.then 内,您会注意到它已被填充:)

【讨论】:

  • 我想填充数组“数据”并在其他地方使用它。怎么做?谢谢!
  • 所以我基本上是用数组'data'中的数据更新我的html。我不知道该怎么做。
  • @Amir 这真的取决于你使用什么框架,你正在寻找什么流程......基本上你可以做一些事情,比如在then 子句中发出一个事件,或者执行一个您将传递Data 的函数,该函数将执行您想要的用例。如果这些选项都与您无关 - 这更像是一个设计挑战,您应该打开另一个问题,在其中描述不同的新问题,并提供有关您的工作环境的更多详细信息,您到底要做什么,在您的哪个位置您填充数据的代码以及您想在哪里使用它等
  • 我在上面附上了一张图片,解释了我想要实现的目标。谢谢!
  • 我不是很熟悉express,但是我对你图片中的代码有几个疑问:1.为什么data.push(input)是重复的?您可以在if-else 之后执行此操作。 2. 如果你之后删除它,为什么还要使用 Data 变量?如果你真的想用 1 个对象渲染一个数组,你可以做 `res.render("home", { data: [{...input}] }。3. 这可能是一个完全错误,但我认为您渲染数据并立即将其设置为 [],这可能会导致问题。如果您使用我在 2 中描述的方法,它将渲染输入的副本,这可能会解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2021-12-26
  • 2021-10-19
  • 1970-01-01
  • 2014-08-30
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多