使用JavaScript进行API调用和将数据写入文件时出现异步问题
我试图从Hubspot获取数据,并将其返回的JSON写入文件。我特别使用这个软件包,因为它有一个内置的故障保护Hubspot的费率限制 不幸的是,我最近没有编写那么多代码,我的代码遇到了一个异步问题。如果有人能告诉我我做错了什么,那就太棒了,因为我真的需要让这个脚本工作起来 我的代码:使用JavaScript进行API调用和将数据写入文件时出现异步问题,javascript,node.js,asynchronous,hubspot,Javascript,Node.js,Asynchronous,Hubspot,我试图从Hubspot获取数据,并将其返回的JSON写入文件。我特别使用这个软件包,因为它有一个内置的故障保护Hubspot的费率限制 不幸的是,我最近没有编写那么多代码,我的代码遇到了一个异步问题。如果有人能告诉我我做错了什么,那就太棒了,因为我真的需要让这个脚本工作起来 我的代码: const Hubspot = require('hubspot'); const fs = require('fs'); const hubspot = new Hubspot({ apiKey: 'apiKe
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);
})();
const Hubspot=require('Hubspot');
常数fs=要求('fs');
const hubspot=新的hubspot({apiKey:'apiKey'});
让我们参与=[];
常数vid=[
“dummyId”、“dummyId2”、“dummyId3”
];
函数createFile(){
fs.writeFile('./Engagements.json',engage,(err)=>{
如果(错误){
控制台日志(err);
返回;
}
console.log('Success!');
});
}
(功能(){
对于(i=0;i{engage.push(results)});
}
setTimeout(createFile,10000);
})();
下面是我收到的错误消息:
(节点:37315)未处理的Promisejection警告:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:53)
从代码段进行调试有点困难,但从错误消息中,您可以尝试以下方法:
(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);
})();
(函数(){
对于(i=0;i{
啮合。推动(结果)
}).catch(err=>console.log(err))
}
setTimeout(createFile,10000);
})();
基本上,你需要一个陷阱,这样我们就不会得到未经处理的拒绝承诺。。。这可能无法解决整个问题,但这是朝着正确方向迈出的一步…这是一个正确的.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);
})();
(函数(){
对于(i=0;i{
参与。推动(结果);
})
.catch(err=>console.log(err));
}
setTimeout(createFile,10000);
})();
难道你不应该等到所有的承诺都兑现了吗?与其依赖于setTimeout
,不如等待所有承诺(查找Promise.all
)。你也可以看看这篇文章()
在你的情况下,它会像
(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();
});
})();
(函数(){
var承诺=[];
对于(i=0;i p.catch(e=>e)),然后(results=>{
results.forEach(result=>{
如果(!(错误的结果实例)){
啮合。推动(结果);
}
});
createFile();
});
})();
嗯。我将我的代码更改为与您完全相同的代码,但仍然得到完全相同的错误。这是一个放置.catch的奇怪位置。这不会解决您的问题,但是,let engage=[]
也应该是一个常量
。在之后添加一个.catch,这样您就可以看到没有使用setTimeout的错误(
等待异步进程完成是一场等待发生的灾难。您应该将for循环生成的所有承诺收集到一个数组中,然后在调用createFile
之前使用promise.all等待它们全部完成。但是,首先,您需要使承诺停止失败。vid.i
处于取消状态罚款。应该是vid[i]
@KevinB关于添加避免setTimeout的评论很有帮助,但如果您能用一些代码回答,我将不胜感激,这样我就可以看到如何实施您的建议。这确实很有帮助!我仍然收到一个错误,但现在完全不同了。这次是400个错误。不幸的是,它仍然说错误未定义,但我认为是朝着正确的方向迈出的一步。太棒了。谢谢你告诉我代码应该是什么样子!它非常有用。这确实修复了我的错误。不幸的是,mycreateFile
函数创建的文件中没有任何内容。你知道哪里出了问题吗?我发现你的createFile
函数有两个问题。其中一个问题你不同意使用json将转换为json。在写入之前将字符串化。另外fs.writeFile
将覆盖现有文件(不确定是否需要)。如果您不打算覆盖,您可能需要查看调用fs.truncate
,然后调用fs.writeFile
您是否可以确保使用上述代码返回结果
?可以先使用控制台.log
打印确认。也不要忘记在编写后关闭fs
(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();
});
})();