由于官方的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 22 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 16 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 32 33 34 35 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编程系列: