太多的回调.nodeJS airtable api



首先,我是NodeJS的新手,想提高我的技能。我有一个表格在Airtable,并想从它得到所有的元素。使用nodejs的airtable api很容易。但我想做的是推动和保存这些元素在一个选项卡(JSON, excel…)。为此,我使用回调,因为调用是异步的。我听说过《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); 
};

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

小心!您正在正确地认识到这个函数是异步的,并且您希望等到#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,因为你已经把单独的记录从Airtable推到你的数组'tab'在每次调用#page。此外,如果您想做的不仅仅是记录JSON输出,那么您应该查看Node的File System Library。查看fs#writeFile方法

可以使用async/await。请确保你可以在async函数中使用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)
}

最新更新