由于官方的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); } }); }); }
|
这是结果:
本文的代码可在这里找到:https://github.com/ericet/steemjs-fun/blob/master/getDiscussionsByAuthorBeforeDate.js
自己也是js的初学者,所以有任何问题,欢迎留言指出~
STEEM编程系列:
This page is synchronized from the post: ‘怎么用JS读取作者部分或者所有的帖子?’