等待与我在 if else 语句中的预期不同

Await is not as i expected in if else statements

let metadata = [];

    allNFTs.map(async (e) => {
      if (e.metadata) {
        metadata.push(JSON.parse(e.metadata).attributes);
      } else {
        let config = {
          method: "get",
          url: `http://localhost:3000/api/fetch`,
          header: {
            "Content-Type": "application/json",
          },
        };
        const res = await axios(config);
        const attr = res.data.attributes;
        metadata.push(attr);
        console.log(metadata); // this one worked after below
      }
    });

    console.log(metadata); // this one worked before above

但我想等到我的 axios 完成获取,这样我才能最终 console.log 我的实际元数据。

你的代码问题,你不等待。最新的 console.log 在映射迭代所有项目之前执行。

你应该使用这样的东西:https://www.npmjs.com/package/modern-async 例如

async function init() {
   var ma= require('modern-async')
   await ma.mapSeries(allNFTs,async (e)=>{
   if (e.metadata) {
        metadata.push(JSON.parse(e.metadata).attributes);
      } else {
        let config = {
          method: "get",
          url: `http://localhost:3000/api/fetch`,
          header: {
            "Content-Type": "application/json",
          },
        };
        const res = await axios(config);
        const attr = res.data.attributes;
        metadata.push(attr);
        console.log(metadata);
      }
   })
   console.log(metadata);

}

做出一系列承诺,然后用 Promise.all

等待它们
const metadataPromises = allNFTs.map((e) => {
  if (e.metadata) {
    return Promise.resolve(JSON.parse(e.metadata).attributes);
  } else {
    let config = {
      method: "get",
      url: `http://localhost:3000/api/fetch`,
      header: {
        "Content-Type": "application/json",
      },
    };
    return axios(config).then((res) => res.data.attributes);
  }
});

// await still has to be in an async function
const metadata = await Promise.all(metadataPromises);

console.log(metadata);

// or use .then
Promise.all(metadataPromises).then((metadata) => console.log(metadata));