使用JavaScript进行API调用并将数据写入文件时的异步问题

时间:2018-12-17 21:12:27

标签: javascript node.js asynchronous hubspot

我正在尝试从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)

3 个答案:

答案 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();
    });
})();