1

首先,我是 NodeJS 的新手,想提高我的技能。我在 Airtable 中有一张桌子,想从中获取所有元素。使用 nodejs 的 airtable api 很容易。但我想要做的是将这些元素推送并保存在一个选项卡中以备将来使用(JSON,excel ...)。为此,我正在使用 callbaks,因为调用是异步的。我听说过 Promises,但它对我来说很新,我几乎不理解它。这是我现在的代码:

var Airtable = require('airtable'); 
Airtable.configure({
    endpointUrl: 'https://api.airtable.com',
    apiKey: 'keyKWYJPOEObWhNt2'
});
var base = Airtable.base('app4qIwfmG0ZKAdBH');
var view = "Main View";


var tab = [];
base('Table 1').select({
    view : view}).eachPage(function page(records, fetchNextPage){records.forEach(function(record){
        tab.push({
            "Name": record.get('Name'), 
            "Notes": record.get('Notes')
        });
    });
    fetchNextPage();
    pushToArray(tab);
}, function done (error){
    if(error){ console.log(error);
        console.log(tab);}
});

function pushToArray(tab) {
    TabToJson(tab);
    return tab;
};

function TabToJson(tab){
    console.log(tab);
    return JSON.stringify(tab); 
};

我如何实现承诺?这里有必要吗?我不想以几十个回调函数结束。谢谢大家,祝你有美好的一天!

4

2 回答 2

4

这里小心!你在正确的轨道上意识到这个函数是异步的,你想等到#eachpage 的每次迭代都解决了,然后再编写输出你的 JSON,就像 Promise 一样。但是 Airtable 已经提供了你正在寻找的东西:回调

function done (error){
  if(error){ console.log(error);
    console.log(tab);
  }
}

将在最后一次成功调用 #fetchNextPage 后立即运行。这是您应该拥有 JSON 编写逻辑的地方。你会想要类似的东西

function done (error){
  TabToJson(tab);

  if(error){ console.log(error);
    console.log(tab);
  }
}

您不需要函数 pushToArray,因为您已经在每次调用 #page 时将 Airtable 中的各个记录推送到数组“选项卡”中。此外,如果您想做的不仅仅是记录您的 JSON 输出(您的问题看起来如此),您应该查看 Node 的File System Library。签出 fs#writeFile 方法。

于 2016-10-20T19:58:05.343 回答
3

您可以使用 async/await 。请确保您可以在异步函数中使用 await。

try {
  const records = await base('Table 1').select({ view }).all()

  records.map((record) => {
    tab.push({
        "Name": record.get('Name'),
        "Notes": record.get('Notes')
    });

    pushToArray(tab)
  })
} catch (e) {
  console.error(e)
}
于 2019-12-24T10:51:56.643 回答