首先,我是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)
}