首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何进行链式抓取,并在每个步骤可用时显示结果?

问如何进行链式抓取,并在每个步骤可用时显示结果?
EN

Stack Overflow用户
提问于 2021-03-05 01:46:13
回答 2查看 44关注 0票数 0

我从API获取文章列表数据,并使用/fetch Unsplash API根据获取的每个文章标题获取相关图像。

这是我的代码:

代码语言:javascript
复制
let url = 'http://127.0.0.1:8000/api';

async function getData(url) {
    const res = await fetch(url);
    const objects = await res.json();

    await Promise.all(objects.map(async (object) => {
        const res = await fetch('https://api.unsplash.com/search/photos?client_id=XXX&content_filter=high&per_page=1&query=' + object.title);
        const image = await res.json();
        object.image_url = image.results[0].urls.small
        object.image_alt = image.results[0].alt_description
    }));
}

let articles_1 = getData(url + '/articles/index/1/');
let articles_2 = getData(url + '/articles/index/2/');
let articles_3 = getData(url + '/articles/index/3/');

我在同一个页面上同时显示了三个不同的类别。这就是为什么我调用该函数三次的原因。

问题:

当此函数生效时,在获取文章数据和图像后显示结果。但为了缩短用户等待时间,我想先在获取时显示文章数据,然后在获取时显示图像。无论是Svelte响应式声明还是纯Javascript,我如何实现它?

EN

回答 2

Stack Overflow用户

发布于 2021-03-05 02:23:13

您可能希望将这两个函数分开,以便可以按顺序调用它们。

代码语言:javascript
复制
const endpoint = 'http://127.0.0.1:8000/api';

const getArticles = async (url) => {
    return fetch(url).res.json();
};
const renderArticles = async (articles) => {
    // render article set and return it as a DOM object
    return articlesDOM;
};

const getImageForArticle = async (articleNode) => {
    const res = await = fetch('https://api.unsplash.com/search/photos?client_id=XXX&content_filter=high&per_page=1&query=' + object.title);
    const img = new Image();
    img.src = res.results[0].urls.small;
    img.alt = res.results[0].alt_description;
    return {img, articleNode};
};
const renderImage = async (stuff) => {
    const {img, articleNode} = stuff;
    // inject your img into your article
};

// now call in sequence

getArticles(endpoint+'/articles/index/1/').then(renderArticles).then(articleNodes => {
    const promises = articleNodes.map(articleNode => {
        return getImageForArticle(articleNode).then(renderImage);
    });
    return Promise.all(promises);
});
票数 0
EN

Stack Overflow用户

发布于 2021-03-06 02:25:13

虽然我不能完全确定你在尝试做什么(我没有一个最小的工作示例),但这里是我最好的尝试:

代码语言:javascript
复制
var url = 'http://127.0.0.1:8000/api';

async function getData(url) {
  var data = fetch(url)
    .then(data => data.json())
  
  await data.then(data => ArticleFunc(data))
  
  await data.then(function(data) {
      data.map(function(object) {
        fetch('https://api.unsplash.com/search/photos?client_id=XXX&content_filter=high&per_page=1&query=' + object.title)
          .then(data => data.json())
        object.image_url = image.results[0].urls.small
        object.image_alt = image.results[0].alt_description
        ImageFunc(object)
      })
    })
}

function ArticleFunc(data){
  //display article
}

function ImageFunc(data){
  //display image
}

getData(url + '/articles/index/1/');
getData(url + '/articles/index/2/');
getData(url + '/articles/index/3/');

请注意,这将被视为伪代码,同样,由于缺少最小的工作示例,它未经过测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66480353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档