Javascript Node.JS Airtable-Await不';Don’不要等待承诺得到解决

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) => {

我试图在node.js应用程序中从Airtable获取数据,但在我的承诺得到解决后,我无法获得结果

这是我的密码:

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;
    });
}