Shopplattform, lade jede Sekunde 10 Artikel

Ich habe eine Website, auf der Benutzer Artikel verkaufen können, die in der Ethereum-Blockchain gespeichert werden. Auf dieser Website sieht die Oberseite wie folgt aus:

<div id="recentArticles"></div>

Der Vertrag beinhaltet Folgendes (ich habe nur die wichtigen Teile geschrieben):

struct Article {
    address seller;
    uint bid;
    uint bidder;    
}

Article[] articles;

function getArticle(uint _id) returns(address seller, uint bid, uint bidder){
    return(articles[_id].seller,articles[_id].bid,articles[_id].bidder);
}

function getArticlesAmount() returns(uint amount) {
    return articles.length;
}

Der Javascript-Code:

function initiateArticles() {
    contract.getArticleAmount({from: web3.eth.accounts[0]},function(error, result)
    {
        if(!error)
        {
            i = 0;
            while(i <= result) {
                getArticle(i)
                i++;
            }
        }
        else {
            console.log(error);
        }
    });
}

function getArticle(id) {
    contract.getArticle(id, {from: web3.eth.accounts[0]},function(error, result)
    {
        if(!error)
        {
            document.getElementById("recentArticles").innerHTML = document.getElementById("recentArticles").innerHTML + result[0] + result[1]...;
            ## This is not the finished code. Here I need help.
        }
        else {
            console.log(error);
        }
    });
}

document.onload = initiateArticles();

Nun möchte ich Folgendes: Wenn ein Benutzer die Website besucht, soll er den Vertrag aufrufen, um die 10 letzten Artikel zu laden und sie im div "recentArticles" anzuzeigen. Das ist einfach und ich habe das erfolgreich gemacht. Aber jetzt kommt der Teil, wo ich Hilfe brauche.

Ich möchte, dass jede Sekunde ein weiterer Aufruf zum Vertrag erfolgt, um die neusten Werte der 10 aufgerufenen Artikel zu erhalten.

Beispiel: Der Benutzer kommt auf die Website und sieht sie sich an. Es wurden die letzten 10 Artikel geladen. Jemand hat auf einen Artikel geboten. Der Artikel im div sollte nun das neue Gebot anzeigen.

Was ist der beste Weg, um eine Funktion zu erstellen, die jede Sekunde für jeden Artikel einen Aufruf durchführt? Ich würde 10 "Updater/Countdowns" benötigen.

Vielen Dank für Antworten.

Das Fragen nach einem Wert braucht kein Benzin. Es ist im Grunde nur eine Anfrage an getArticle.

Antworten (1)

Dies kann über Javascript erfolgen, entweder mit setInterval(), oder setTimeout():

Wenn es Ihnen egal ist, ob der Code innerhalb von timermöglicherweise länger als Ihr Intervall dauert, verwenden Sie setInterval():

setInterval(function_that_checks_the_price_for_a_product, delay)

Dadurch wird die als erster Parameter übergebene Funktion immer wieder ausgelöst.

Ein besserer Ansatz ist, setTimeoutzusammen mit einer self-executing anonymousFunktion zu verwenden:

(function(){
    // do some stuff
    setTimeout(arguments.callee, 15000); //execute itself every 15 seconds - the avg block time on ethereum
})();

das garantiert, dass der nächste Aufruf nicht erfolgt, bevor Ihr Code ausgeführt wurde. Ich habe arguments.calleein diesem Beispiel als Funktionsreferenz verwendet. Es ist eine bessere Möglichkeit, der Funktion einen Namen zu geben und diesen innerhalb aufzurufen, setTimeoutda arguments.calleesie in ecmascript 5 veraltet ist.

Mit sähe setInterval()Ihre Funktion so aus:initiateArticles()

function initiateArticles() {
    contract.getArticleAmount({from: web3.eth.accounts[0]},function(error, result)
    {
        if(!error)
        {
            i = 0;
            while(i <= result) {
                //need a wrapper anonymous function so we can send the i param to getArticle()
                setInterval(getArticle.bind({articleId: i}), 15000);
                i++;
            }
        }
        else {
            console.log(error);
        }
    });
}

und ändern Sie auch die Funktion getArticle()zu:

function getArticle() {
    const id = this.articleId;
    contract.getArticle(id, {from: web3.eth.accounts[0]},function(error, result)
    {
        if(!error)
        {
            document.getElementById("recentArticles").innerHTML = document.getElementById("recentArticles").innerHTML + result[0] + result[1]...;
            ## This is not the finished code. Here I need help.
        }
        else {
            console.log(error);
        }
    });
}
Vielen Dank für den Kommentar, scheint, als wären wir dem näher gekommen. Was ich mache, ist eine Anfrage an getArticlesAmount zu senden, die mir zum Beispiel 559 gibt, wenn es 559 Artikel gibt. Um jetzt die letzten 10 zu erhalten, mache ich eine While-Schleife, bis ich die Artikel von ID 549 bis 559 bekomme. Dann rufe ich getArticlesAmount mit der ID innerhalb der While-Schleife auf. Was ist der beste Weg, um Ihre Idee jetzt mit dem Timeout oder Intervall zu integrieren?
Ich glaube, du wolltest sagen, dass du getArticle( _id )aus deiner Schleife heraus anrufst. Können Sie hier die Leitung angeben, wo Sie anrufen getArticle( _id )?
Verzeihung! Ich habe vergessen, den von mir verwendeten Javascript-Code hinzuzufügen. Ich habe es jetzt hinzugefügt.
Ich habe meine Antwort aktualisiert. Hoffe, es löst Ihr Problem
Danke! Ich habe es ausprobiert und es hat fast funktioniert. Das Problem: Es kommt 10 mal derselbe Artikel zurück. In meinem Fall habe ich also 19 Artikel und anstatt die aktualisierten Informationen für die Artikel 9 bis 19 anzuzeigen, werden sie nur aus dem Artikel 19 angezeigt, aber das 10 Mal.
ok, ich habe das js aktualisiert, um den tatsächlichen istatt den letzten Wert zu verwenden.
Wow danke, das hat funktioniert, vielen Dank! Können Sie bitte kurz erklären, was hier passiert, zum Beispiel was .bind macht? Ich bin mir nicht 100% sicher, wie es funktioniert hat.
Danke dir nochmal. Es hat mir sehr geholfen und ich kann meine Probleme jetzt lösen. Wirklich glücklich über die Lösung!