Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Array.push不是Promise中的函数_Javascript_Arrays_Asynchronous_Promise_Scoping - Fatal编程技术网

Javascript Array.push不是Promise中的函数

Javascript Array.push不是Promise中的函数,javascript,arrays,asynchronous,promise,scoping,Javascript,Arrays,Asynchronous,Promise,Scoping,以下代码块遇到此错误。您可以看到,我在async函数中实例化了report=[],但在运行async Promise.all之前。在该承诺的范围内,我运行了一些处理,这些处理应该获取数据并将其推回到报告数组中,该数组的范围超出了承诺的范围。我尝试从const更改为let,并将Promise放入try/catch块,但总是得到相同的错误 完全错误: TypeError: report.push(...) is not a function (node:2568) UnhandledPromiseR

以下代码块遇到此错误。您可以看到,我在
async
函数中实例化了
report=[]
,但在运行
async Promise.all之前。在该承诺的范围内,我运行了一些处理,这些处理应该获取数据并将其推回到
报告
数组中,该数组的范围超出了承诺的范围。我尝试从
const
更改为
let
,并将
Promise放入
try/catch
块,但总是得到相同的错误

完全错误:

TypeError: report.push(...) is not a function
(node:2568) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
代码:

(异步(环境)=>{
常量报告=[]
const subscriptions=wait xm.subscriptions.getMany(env);
等待Promise.all(subscriptions.map(sub=>{
让apps_和_lobs=xm.subscriptions.process_apps_和_lobs(sub.criteria.data);
设sub_obj={
sub_名称:sub.name,
sub_uuid:sub.id,
表格名称:sub.form.name,
表格id:sub.form.id,
计划名称:sub.form.plan.name,
计划id:sub.form.plan.id,
所有者\目标名称:sub.owner.targetName,
所有者名称:sub.owner.firstName,
所有者\姓氏:sub.owner.lastName,
应用程序:应用程序和lobs.apps,
lob:apps_和_lobs.lobs
}
报告推送(子对象)//{
let recipients=wait xm.subscriptions.getSubscribers(env,null,sub.id);
recipients.map(r=>{
cmt(JSON.stringify(r,null,2));
})
})(环境)
}))
})(prod);

正如安德烈亚斯所指出的,它是一个分号。始终检查分号,我想…

使用
array.save()
as
report.save()
保存对象本身

(async (env) => {
  const report        = []
  const subscriptions = await xm.subscriptions.getMany(env);

  await Promise.all(subscriptions.map(sub => {
    let apps_and_lobs = xm.subscriptions.process_apps_and_lobs(sub.criteria.data);
    let sub_obj = {
      sub_name         : sub.name,
      sub_uuid         : sub.id,
      form_name        : sub.form.name,
      form_id          : sub.form.id,
      plan_name        : sub.form.plan.name,
      plan_id          : sub.form.plan.id,
      owner_targetName : sub.owner.targetName,
      owner_firstName  : sub.owner.firstName,
      owner_lastName   : sub.owner.lastName,
      applications     : apps_and_lobs.apps,
      lob              : apps_and_lobs.lobs
    }

    report.push(sub_obj) // <----- ***** This is failing ******
    report.save();

    (async (env) => {
      let recipients = await xm.subscriptions.getSubscribers(env, null, sub.id);
      recipients.map(r => {
        util.cmt(JSON.stringify(r, null, 2));
      })
    })(env)
  }))
})(prod);
(异步(环境)=>{
常量报告=[]
const subscriptions=wait xm.subscriptions.getMany(env);
等待Promise.all(subscriptions.map(sub=>{
让apps_和_lobs=xm.subscriptions.process_apps_和_lobs(sub.criteria.data);
设sub_obj={
sub_名称:sub.name,
sub_uuid:sub.id,
表格名称:sub.form.name,
表格id:sub.form.id,
计划名称:sub.form.plan.name,
计划id:sub.form.plan.id,
所有者\目标名称:sub.owner.targetName,
所有者名称:sub.owner.firstName,
所有者\姓氏:sub.owner.lastName,
应用程序:应用程序和lobs.apps,
lob:apps_和_lobs.lobs
}
报告推送(子对象)//{
let recipients=wait xm.subscriptions.getSubscribers(env,null,sub.id);
recipients.map(r=>{
cmt(JSON.stringify(r,null,2));
})
})(环境)
}))
})(prod);

您是否尝试通过插入
调试器来检查值report.push()
call?上方的code>语句,并注意分号。这不应该是个问题,但完全依赖ASI是个坏主意。wtf?它是一个分号。我不敢相信这就是问题所在。感谢您指出这一点……这很有趣,因为我一直认为ASI规则是“如果不会导致语法错误,请在每行末尾插入一个semi”-显然这一点已经改变,并且变得不那么可预测。我总是用分号,多亏了你的问题,现在我有了一个理由。谢谢,OP@安非他命机器有时候在你做一个生命或开头的
将被解释为添加到上一条语句中的另一个函数调用。这只是在设计语言时始终使用分号的另一个原因。而且,当您缺少分号时,错误消息通常没有帮助,因为解释器正在尝试执行您从未期望它尝试的操作。插入sereport.push(sub_obj)
之后的micolon在不添加新语句的情况下修复了它。
(async (env) => {
  const report        = []
  const subscriptions = await xm.subscriptions.getMany(env);

  await Promise.all(subscriptions.map(sub => {
    let apps_and_lobs = xm.subscriptions.process_apps_and_lobs(sub.criteria.data);
    let sub_obj = {
      sub_name         : sub.name,
      sub_uuid         : sub.id,
      form_name        : sub.form.name,
      form_id          : sub.form.id,
      plan_name        : sub.form.plan.name,
      plan_id          : sub.form.plan.id,
      owner_targetName : sub.owner.targetName,
      owner_firstName  : sub.owner.firstName,
      owner_lastName   : sub.owner.lastName,
      applications     : apps_and_lobs.apps,
      lob              : apps_and_lobs.lobs
    }

    report.push(sub_obj) // <----- ***** This is failing ******
    report.save();

    (async (env) => {
      let recipients = await xm.subscriptions.getSubscribers(env, null, sub.id);
      recipients.map(r => {
        util.cmt(JSON.stringify(r, null, 2));
      })
    })(env)
  }))
})(prod);