Javascript Node.JS Airtable-Await不';Don’不要等待承诺得到解决
我试图在node.js应用程序中从Airtable获取数据,但在我的承诺得到解决后,我无法获得结果 这是我的密码:Javascript Node.JS Airtable-Await不';Don’不要等待承诺得到解决,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我试图在node.js应用程序中从Airtable获取数据,但在我的承诺得到解决后,我无法获得结果 这是我的密码: async function getData(code) { return await airtableBase("Data") .select({ filterByFormula: `{code} = "${code}"`, }) .firstPage((err, records) => {
async function getData(code) {
return await airtableBase("Data")
.select({
filterByFormula: `{code} = "${code}"`,
})
.firstPage((err, records) => {
if (err) {
console.log(err);
return {};
}
console.log(records[0].fields);
return records[0].fields;
});
}
以下是我记录的内容:
undefined
undefined
undefined
{
code: '1',
fullname: 'Test 1',
logo: '...'
}
{
code: '2',
fullname: 'Test 2',
logo: '...'
}
{
code: '3',
fullname: 'Test 3',
logo: '...'
}
你认为
airtableBase(...).select(...).firstPage((error, result) => {})
返回一个承诺-它没有
接受节点样式回调的函数很少。。。i、 e
function(error, result)
还愿
function getData(code) {
return new Promise((resolve, reject) => {
airtableBase("Data")
.select({
filterByFormula: `{code} = "${code}"`,
})
.firstPage((err, records) => {
if (err) {
console.log(err);
return reject({});
}
console.log(records[0].fields);
resolve(records[0].fields);
});
});
}
更改getData以返回承诺
function getData(code) {
return new Promise((resolve, reject) => {
airtableBase("Data")
.select({
filterByFormula: `{code} = "${code}"`,
})
.firstPage((err, records) => {
if (err) {
console.log(err);
return reject({});
}
console.log(records[0].fields);
resolve(records[0].fields);
});
});
}
还有
stuff.map(async (object) => {
embedData = getEmbedData(object);
data = await getData(embedData.code);
console.log(data);
})
不能保证订单是正确的,在这种情况下可能是正确的,但不能保证
上面写得更好
Promise.all(stuff.map((object) => {
embedData = getEmbedData(object);
return getData(embedData.code);
}))
.then(results => {
results.forEach(item => console.log(item));
})
或者如果该代码在异步
函数中
const results = await Promise.all(stuff.map((object) => {
embedData = getEmbedData(object);
return getData(embedData.code);
}))
results.forEach(item => console.log(item));
注意:绝对没有进行拒绝测试,因为您的代码没有,但实际上,您应该尝试/catch(如果使用async/await)或.catch(如果使用.then)
请注意,
.firstPage
如果没有给出回调函数,那么实际上可能会返回一个承诺,因此您的代码可能会更简单
但是,由于您没有说明您正在使用的db库的任何内容,因此我无法确定上述操作是否有效您假设
airtableBase(…).select(…).firstPage(…)
返回一个承诺-它没有-接受节点样式回调的函数很少<代码>函数(错误、结果)也很少返回承诺<代码>异步函数x(){return await y()}是冗余的。。。如果函数x(){return y()}返回一个承诺(在上面提到的情况下,它不会返回承诺),那么写函数x(){return y()}会更好吗?如果我删除“data=”行中的“await”,我会记录这个:Promise{}Promise{}Promise{}Promise{}不管我怎么理解,它返回的是一个承诺,因为它是一个异步函数,对吗?是的,async
总是返回一个承诺,但是.firstPage((err,records)=>{})
没有回复承诺书非常感谢您的解释,我现在明白了@Roigujat-请注意,.firstPage
如果没有回调参数调用它,实际上可能会返回一个承诺-但是由于您没有提到您正在使用的db库,我假设它根本没有-我只是在case.firstPage()
中添加了代码(即没有回调)返回一个promise@RoiGoujat正如提示:在if(err)
块中,之前没有return
语句,因此如果您复制了上面的示例,请确保包含它。否则,如果发生错误,由于控制台.log
&resolve()
在if
之外,您还将得到一个无法读取未定义的属性0的属性。另外,当错误发生时,您的原始代码通过返回{}
而“无声地失败”,您可以在这个版本中通过执行解析({})来模拟它代码>而不是拒绝({})代码>或<代码>拒绝(错误)
@RickN-是的,对此我很抱歉,我通常使用else块或return-reject()
-今天只是“懒惰”:p
function getData(code) {
return airtableBase("Data")
.select({
filterByFormula: `{code} = "${code}"`,
})
.firstPage()
.promise() /* this could be needed, again, depending on the library */
.then(records => {
return records[0].fields;
});
}