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);
}
})();
我正在使用 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);
}
})();