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.
Dies kann über Javascript erfolgen, entweder mit setInterval()
, oder setTimeout()
:
Wenn es Ihnen egal ist, ob der Code innerhalb von timer
mö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, setTimeout
zusammen mit einer self-executing anonymous
Funktion 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.callee
in diesem Beispiel als Funktionsreferenz verwendet. Es ist eine bessere Möglichkeit, der Funktion einen Namen zu geben und diesen innerhalb aufzurufen, setTimeout
da arguments.callee
sie 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);
}
});
}
getArticle( _id )
aus deiner Schleife heraus anrufst. Können Sie hier die Leitung angeben, wo Sie anrufen getArticle( _id )
?i
statt den letzten Wert zu verwenden.
dkb