怎么用JS读取作者部分或者所有的帖子?

怎么用JS读取作者部分或者所有的帖子?

由于官方的steemjs开发文档实在太简陋了,所以打算具体介绍一些函数的怎么使用,并且把代码放到了github上.

刚看到@lemooljiang蒋老师在用getDiscussionsByAuthorBeforeDate的函数,并且看到他遇到了一些问题,所以打算介绍一下这个函数。

官方的文档对这个函数的介绍:

1
2
3
steem.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, function(err, result) {
console.log(err, result);
});

  • author: 作者
  • startPermlink: 从哪篇帖子开始。如果是最早的那篇,这里填null
  • beforeDate: 从哪个时间开始的文章
  • limit:一次读取多少篇帖子。(最高限制100篇)

如果你要显示最近100篇帖子的标题, 程序可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const steem = require('steem');

start();
async function start() {
let posts = await getPosts('ericet');
posts.forEach(post => {
console.log(post.root_title);
});

}

function getPosts(author, startPermlink = null, limit = 100) {
return new Promise((resolve, reject) => {
let beforeDate = new Date().toISOString().split('.')[0];
steem.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, function (err, result) {
if (result.length ) {
resolve(result)
}
});
});
}

但是,如果你想要显示超过100篇的帖子,那你可能和蒋老师一样陷入麻烦:SteemJS开发的难与易

这里介绍一个简单的方法,读取超过100篇帖子。那就是用Recursion(递归)。Recursion的意思是函数的定义中使用函数自身的方法。方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getPosts(author, startPermlink = null, limit = 100, posts = []) {
return new Promise((resolve, reject) => {
let beforeDate = new Date().toISOString().split('.')[0];
steem.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, function (err, result) {
if (result.length > 1) {
posts = [...posts, ...result];
getPosts(author, result[result.length - 1].permlink, limit, posts)
.then(resolve)
.catch(reject);
} else {
resolve(posts);
}
});
});
}

这段代码里,当返回的结果多于1,就会用最后一篇帖子的permlink作为起始点,继续读取帖子。比如第一轮读取1-100,第二轮100-200,第三轮200-300,。。。,直到没有文章可以读取。

但是有一个小问题,那就是每轮的最后一篇和下一轮的第一篇是重复的。这里可以过滤掉重复的那篇,如果startPermlink等于文章的permlink,就跳过,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function getPosts(author, startPermlink = null, limit = 100, posts = []) {
return new Promise((resolve, reject) => {
let beforeDate = new Date().toISOString().split('.')[0];
steem.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, function (err, result) {
if (result.length > 1) {
let newResult = [];
result.forEach(post =>{
if(post.permlink!=startPermlink){
newResult.push(post);
}
});
posts = [...posts, ...newResult];
getPosts(author, result[result.length - 1].permlink, limit, posts)
.then(resolve)
.catch(reject);
} else {
resolve(posts);
}
});
});
}

完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
	const steem = require('steem');

start();
async function start() {
let posts = await getPosts('ericet');
posts.forEach(post => {
console.log(post.root_title);
});

}
function getPosts(author, startPermlink = null, limit = 100, posts = []) {
return new Promise((resolve, reject) => {
let beforeDate = new Date().toISOString().split('.')[0];
steem.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, function (err, result) {
if (result.length > 1) {
let newResult = [];
result.forEach(post =>{
if(post.permlink!=startPermlink){
newResult.push(post);
}
});
posts = [...posts, ...newResult];
getPosts(author, result[result.length - 1].permlink, limit, posts)
.then(resolve)
.catch(reject);
} else {
resolve(posts);
}
});
});
}

这是结果:
image.png

本文的代码可在这里找到:https://github.com/ericet/steemjs-fun/blob/master/getDiscussionsByAuthorBeforeDate.js

自己也是js的初学者,所以有任何问题,欢迎留言指出~


STEEM编程系列:


This page is synchronized from the post: ‘怎么用JS读取作者部分或者所有的帖子?’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×