用steemjs嵌套的读取文章的所有评论

in #cn7 years ago

在上一篇文章如何用steemjs读取文章的评论 — Steemit中,和大家介绍了如何用SteemJs来读取评论,但并不完整。当时也提出了只读取了第一层的评论,如何读取所有评论呢?这里就给大家介绍一下:

1、blockchain的数据结构

这里当然不会详细讲,我也不太清楚。但从读取评论时我就发现了,其实在blockchain中评论和文章差别非常小,你可以把评论写的比文章都复杂。我们在这里用节点来表示,你可以把节点想象成一块数据,里面存储的都是文字。

多数节点都是有子有父的,我们可以通过父节点来查找他的子节点,正如如何用steemjs读取文章的评论 — Steemit中所说的那样,用steem.api.getContentReplies(author, permlink, callback)这个函数就可以。

如果一个节点没有父节点,那么这个节点保存的内容就是传统意义上的文章,如果一个文章有父节点,那么这个节点保存的就是传统意义上的评论。如果明白了这一点,那些递归的查询所有评论就非常容易了。

2、递归查询代码

还是老规矩,我也将代码发到SteemJsExamples/readNestedComments.html at master · RileyGe/SteemJsExamples上了,有兴趣可以自己翻看。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">

    <script type="text/javascript" src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-latest.min.js"></script>

    <script>
        var localDiscussion = null;
        var index = -1;
        $(document).ready(function () {
        //steem.api.setWebSocket("wss://steemd.minnowsupportproject.org");
            steem.api.setWebSocket("wss://steemd.steemitstage.com");
             
            $("#btnGetComments").click(function () {
                var author = $("#txtAuthor").val();
                var permlink = $("#postLink").val();
                //console.log(permlink);
                steem.api.getContentReplies(author, permlink, contentRepliesCB);                    
            });
        });
        function contentRepliesCB(err, result)
        {
            //console.log(err, result);
            if (!err)
            { 
                //$("#resultsTable").empty();
                for (i = 0; i <= result.length - 1; i++) {
                    //console.log(result[i]);
                    var commentAuthor = result[i].author;                           
                    $("#resultsTable").append(commentAuthor);
                    $("#resultsTable").append(" says: ");
                    var commentContent = result[i].body;
                    $("#resultsTable").append(commentContent);
                    $("#resultsTable").append("<br />");
                    var childrenNo = result[i].children;
                    if(childrenNo > 0)
                    {
                        var commentLink = result[i].permlink;
                        steem.api.getContentReplies(commentAuthor, commentLink, contentRepliesCB);
                    }
                }
            }
            else
            { alert(err);}
        }
    </script>
</head>
<body>
    <hr />

    <div class="expandablerVotes">
        <div>
            Author
            <input type="text" id="txtAuthor" style="width: 150px;" value="rileyge" /> &nbsp;&nbsp;
            Post Link
            <input type="text" id="postLink" style="width: 150px;" value="or-i-am-an-ailurophile" /> &nbsp;&nbsp;
            <input id="btnGetComments" type="button" value="Get Comments Data" />
        </div>
        <br/>
    </div>
    <br/>
    <div id="resultsTable">
    </div>
</body>
</html>

3、代码解释

其实这段代码非常简单,相比如何用steemjs读取文章的评论 — Steemit只是把steem.api.getContentReplies(author, permlink, callback)的回调函数独立出来。

而且在回调函数中增加了一个功能。如果读出的评论的孩子节点多于0个,则嵌套的调用steem.api.getContentReplies(author, permlink, callback)函数把孩子节点的信息也读取出来。

简单吧,只要理解了结构,做起来就非常简单。

Sort:  

这文章发的真及时!

?什么及时?

steemsql开始收费了呢,我正要研究steem.js怎么用呢

恩,恰好赶上了,不过现在steem官方的库只有python和js的让人好不爽。

也有正在测试的mysql
https://steemit.com/dev/@privex/privex-launches-steem-blockchain-database-service
我试了一下还可以,不过因为还在测试中,我也怕数据不全面,所以准备研究steem.js

这些应该是个人出的一些服务吧?会不会也像steemsql一样收费啊?

现在应该不会的,但我估计用的人多了以后,服务器负荷就会增加,要么就会影响效率,要么就也只好收费了。

老师好!又学习了多一点。