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()
asreport.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);