我正在尝试从Hubspot获取数据并将其返回的JSON写入文件。我特别使用此软件包https://www.npmjs.com/package/hubspot,因为它具有针对Hubspot速率限制的内置故障保护功能。
不幸的是,最近我没有那么多代码,所以我遇到了代码异步问题。如果有人可以告诉我我在这里做错了,那真是太棒了,因为我真的需要使此脚本正常工作。
我的代码:
const Hubspot = require('hubspot');
const fs = require('fs');
const hubspot = new Hubspot({ apiKey: 'apiKey' });
let engage = [];
const vid = [
'dummyId', 'dummyId2', 'dummyId3'
];
function createFile () {
fs.writeFile('./Engagements.json', engage, (err) => {
if (err) {
console.log(err);
return;
}
console.log('Success!');
});
}
(function () {
for (i = 0; i <= vid.length; i++) {
hubspot.engagements.getAssociated(hubspot.contacts, vid.i)
.then(results => {engage.push(results)});
}
setTimeout(createFile, 10000);
})();
这是我收到的错误消息:
(node:37315) 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: 53)
答案 0 :(得分:3)
这是一个正确的.catch实现。找到并修复错误后,您仍然应该实施@KevinB在评论中提出的建议。
(function() {
for (i = 0; i <= vid.length; i++) {
hubspot.engagements.getAssociated(hubspot.contacts, vid[i])
.then(results => {
engage.push(results);
})
.catch(err => console.log(err));
}
setTimeout(createFile, 10000);
})();
答案 1 :(得分:2)
从代码段进行调试有点困难,但是从错误消息中可以尝试以下操作:
(function() {
for (i = 0; i <= vid.length; i++) {
hubspot.engagements.getAssociated(hubspot.contacts, vid.i).then(results => {
engage.push(results)
}).catch(err => console.log(err))
}
setTimeout(createFile, 10000);
})();
基本上,您需要抓住一个机会,以便我们不会遇到未处理的承诺拒绝……这可能无法解决全部问题,但这是朝着正确方向迈出的一步……
答案 2 :(得分:1)
您是否要等到所有的承诺都回来了?与其依赖setTimeout
,不如等待所有的诺言(寻找Promise.all
)可能更好。您还可以查看文章(https://davidwalsh.name/promises-results)
Promise.all(promises.map(p => p.catch(() => undefined)));
在您的情况下,它将类似于
(function () {
var promises = [];
for (i = 0; i <= vid.length; i++) {
promises.push(hubspot.engagements.getAssociated(hubspot.contacts, vid.i));
}
Promise.all(promises.map(p => p.catch(e => e))).then(results => {
results.forEach(result => {
if (!(result instanceof Error)) {
engage.push(result);
}
});
createFile();
});
})();