javascript - Node.JS Airtable - Await 不等待 promise 被解决

标签 javascript node.js asynchronous async-await

我正在尝试从我的 node.js 应用程序中的 Airtable 获取数据,但在我的 promise 解决后我无法获得我的结果。
这是我的代码:

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;
    });
}
stuff.map(async (object) => {
      embedData = getEmbedData(object);

      data = await getData(embedData.code);

      console.log(data);
})
这是我记录的内容:
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) => {})
返回一个 Promise - 它没有
很少有采用 Node 样式回调的函数......即
function(error, result) 
返回一个 promise
更改 getData 以返回 Promise
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));
})
或者如果该代码在 async 中功能
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

Please note that .firstPage may actually return a Promise if no callback function is given, so your code may be simpler

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;
    });
}
但是,由于您没有说明您正在使用的 db 库的任何内容,因此我无法确定上述内容是否有效

关于javascript - Node.JS Airtable - Await 不等待 promise 被解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64858450/

相关文章:

javascript - 如何删除包含破坏 C5 接口(interface)的错误 JavaScript 的 block ?

javascript - "define([...], function(...) {...});"形式的 .js 文件是什么意思

node.js - elasticSearch/npm:Elasticdump返回 “self signed certificate”错误

javascript - 从 Promise : [Object Object] 返回一个值

javascript - 如何使用循环通过异步函数更改数组中项目的属性?

java - 像Java中的http请求一样发送async/await .NET 4.5?

Javascript - 简单计数

javascript - react-testing-library - 屏幕与渲染查询

javascript - 为什么在传递/公开 EventEmitter 的 on 函数时需要包装它?

node.js - Open-Telemetry 跨度未显示在 GCP Cloud Trace 中