我正在使用以下内容来获取帖子
http://demo.wp-api.org/wp-json/wp/v2/posts
这默认情况下给了我10个帖子,这在文档中提到.
但我想要所有的帖子,而不必跟踪分页.
那可能吗?
如果没有,我可以运行JavaScript循环来获取所有帖子吗?
谢谢.
最佳答案 解决这个问题的一种方法是使用
RxJS
我们将构建一个小的Observable流,它将:
>输出所有发布数据
>不要强迫我们事先知道帖子或页面的总数
>在分页的情况下,不要强迫跟踪“我们在哪里”
我们将使用的库:
> Axios(简化HTTP GET,因为它在节点和浏览器环境中都有效)
> RxJS v6(目前为Alpha版本,但此处的API与RxJS 5相同)
您的环境和用例会有所不同,对于此示例,我将在Node环境中.
/**
* This will get all posts from a default WordPress REST API
* First we see how many pages there are
* Then we make subsequent XHR requests (via Axios)
* That paginate through every page of posts
*/
// Importing Axios for simple AJAX request
const axios = require('axios')
// Importing RxJS @ v6.0.0-alpha.3
const { Observable, from, range } = require('rxjs')
const { switchMap, concatMap } = require('rxjs/operators')
const endpoint = 'http://demo.wp-api.org/wp-json/wp/v2/posts'
/**
* This sets up the initial request and the Observable stream
* In the return from the endpoint, the Axios request headers will have x-wp-totalpages,
* which gives us... the total pages of posts ;)
*/
const posts$= Rx.Observable.from(axios.get(endpoint))
/**
* We now know the total number of pages,
* so we'll switch to a new Observable that is just a range of numbers
* We'll start with 1, and end with whatever the total number of pages is
* This gives us a stream of 1--n--n--n... (example: 1, 2, 3, 4...)
*/
.switchMap((
{ headers }, // using ES6 function header destructuring and arrow functions here
) => Rx.Observable.range(1, Number(headers['x-wp-totalpages'])))
/**
* We can now paginate through all posts, getting 10/page
* concatMap will fire off a request, waits until it completes, and then fire the next one
* In each subsequent firing, we ask for the next page of posts
*/
.concatMap(page =>
axios.get(endpoint, {
params: {
page,
},
}),
)
.subscribe(
// data here is an Array of WordPress Posts, tacking .length shows us how many per page we are getting
({ data }) => console.log(data.length),
err => console.log('Oh no, an error!', err),
)
资源
> RunKit example with the code above(唯一的区别是在RunKit示例中导入RxJS v5,因为v6尚不可用,但此示例的API没有区别)
> RxJS In Depth – Ben Lesh(视频,来自主要维护者的RxJS的良好入门级别)
> The introduction to Reactive Programming you’ve been missing(@andrestaltz RxJS简介的最佳文字资源)
> https://www.learnrxjs.io/
> Destructuring objects as function parameters in ES6
> Arrow Functions on MDN(检查基本和高级语法)