Promise 不按顺序执行

Promise not executing sequentially

我正在使用 npm 中的一个包从名为 url metadata 的 url 中抓取元数据 我想做的是遍历 json link 列表并从每个 link

中抓取元数据

代码

    doc.edited_feed.items.forEach(item => {
        // get metadata of each item link 
        urlMetadata(item.link).then(metadata => {
        // add new item to the feed with the scraped metadata.image
      console.log("running urlmetadata function")
        feed1.addItem({
          title: item.title,
          link: url,
          description: item.contentSnippet,
          content: item.content,
          id: item.link,
          date: new Date(item.isoDate),
          image: metadata.image
        });
        });


      }
    }); // End Foreach


    console.log("after foreach block");
    response.type("application/xml");
    response.send(feed1.rss2());

问题是元数据url函数在发送响应后运行

输出

    After foreach block
running urlmetadata function
running urlmetadata function
running urlmetadata function

这和我写的完全相反 我想这与异步函数或 promise

有关

请帮忙:/ ?

创建异步函数并在 for 循环中等待每个响应

const funcName = async (items) => {
    for (let i = 0; i < items.length; i++) {
        let metadata = await urlMetadata(item.link);
        // do stuff with metadata
    }
}

至少,一个 Promise 是一个带有 then 方法的对象,它接受一个回调函数来对返回的最终值进行操作。 ...

我建议你use fetch synchronousy适合你的情况

Promise 通过 resolve/reject 和 then 之间的某种竞赛来实现。它跟踪自己在闭包中的进度状态,知道它是待处理、已解决还是已拒绝。

(async () => {
      try {
        console.log("Start");

        for (let index = 0; index < doc.edited_feed.items.length; index++) {
          const item = doc.edited_feed.items[index];
          const metadata = await urlMetadata(item.link);
          feed1.addItem({
            title: item.title,
            link: url,
            description: item.contentSnippet,
            content: item.content,
            id: url,
            date: new Date(item.isoDate),
            image: metadata.image
          });
          console.log(metadata.image, "hellooooooooo");
        }
        response.type("application/xml");
        response.send(feed1.rss2());

        console.log("End");
      } catch (e) {
        console.log(e);
      }
    })();