Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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进行API调用和将数据写入文件时出现异步问题_Javascript_Node.js_Asynchronous_Hubspot - Fatal编程技术网

使用JavaScript进行API调用和将数据写入文件时出现异步问题

使用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

我试图从Hubspot获取数据,并将其返回的JSON写入文件。我特别使用这个软件包,因为它有一个内置的故障保护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);
})();
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个错误。不幸的是,它仍然说错误未定义,但我认为是朝着正确的方向迈出的一步。太棒了。谢谢你告诉我代码应该是什么样子!它非常有用。这确实修复了我的错误。不幸的是,my
createFile
函数创建的文件中没有任何内容。你知道哪里出了问题吗?我发现你的
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();
    });
})();