回调函数,返回带有给定类别的wordpress博客上所有帖子的数组

时间:2018-03-26 19:00:31

标签: javascript arrays json wordpress ecmascript-6

我正在尝试编写一个回调函数,该函数从wordpress博客返回给定类别的所有帖子的数组,这样我就可以将这些数据提取到静态网站编译器中。

The API一次只返回100,所以我必须逐页遍历它们并将它们添加到数组中。

我设法循环遍历它们并将它们记录到控制台但我无法弄清楚如何在使用promises时将它们添加到数组中。我不确定我应该传递给push()

的争论

任何指针都会受到赞赏。

const getData = (category, number = 0, page = 1) =>
  fetch(`https://public-api.wordpress.com/rest/v1/sites/www.accessaa.co.uk/posts?category=${category}&number=${number}&page=${page}&order_by=date`)
    .then(res => res.json())

const found = (category) =>
  getData(category)
    .then(json => json.found)

var total = new Promise(function(resolve, reject) {
  resolve(found('news'))
})

var times = total.then(function(value) {
   return Math.ceil(value/100)
})

var calls = times
  .then(function(callsToMake) {
    items = []
    for (i = 1; i < callsToMake; i++) {
      getData('news', 100, i)
        .then(json => json.posts)
        .then(items.push(posts))
    }
    return items
  })

2 个答案:

答案 0 :(得分:1)

您需要声明&#34;帖子&#34;:

.then(json => json.posts)
    .then(posts=> items.push(posts))

或者简单地说:

.then(json => items.push(json.posts))

B.T.W:&#39; var total&#39;很奇怪。你正在用承诺敲定承诺

答案 1 :(得分:1)

为了便于阅读,我更改了一些代码结构。

您的问题的解决方案是创建一个异步任务池,然后并行运行它们。 Promise.all([promises])对后者是完美的,因为它将返回已解析值的数组,直到所有的promise都已成功解析或其中一个已被拒绝。

const getData = (category, number = 0, page = 1) =>
  fetch(`https://public-api.wordpress.com/rest/v1/sites/www.accessaa.co.uk/posts?category=${category}&number=${number}&page=${page}&order_by=date`)
    .then(res => res.json())

const found = (category)=> getData(category).then(json => json.found);

found('news')
.then((value)=>{
    return Math.ceil(value/100);
})
.then((callsToMake)=>{
    let tasks = [];
    for (i = 1; i < callsToMake; i++) {
        tasks.push(getData('news', 100, i)) //<--- Fill tasks array with promises that will eventually return a value
    }
    return Promise.all(tasks); //<-- Run these tasks in parallel and return an array of the resolved values of the N Promises.
})
.then((arrOfPosts)=>{
    let allPosts = [];
    for(var elem of arrOfPosts)
        allPosts = allPosts.concat(elem.posts);
    
    console.log(allPosts);  
}).catch((err)=>{
    console.log(err);
})