0

Ich bin neu bei Node.js und asynchronen Aufrufen, aber ich versuche ein Programm zu erstellen, das automatisch mehrere Transaktionen vornehmen kann. Die Sache ist, gerade stelle ich zuerst eine Verbindung zu Hyperledger Fabric her und führe dann die Funktion durch eine for-Schleife aus.Schleife durch mehrere Versprechen effizient

Das ist ziemlich schnell, aber ich freue mich auf die Geschwindigkeit zu verbessern. Dies ist der Code, den die Verbindung initiiert:

init() { 
     return this.businessNetworkConnection.connect(this.connectionProfile, this.businessNetworkIdentifier, participantId, participantPwd) 
      .then((result) => { 
       console.log(chalk.green('Connected to Hyperledger!')); 
       this.businessNetworkDefinition = result; 
      }) 
      .catch(function (error) { 
       console.log('An error occured: ', chalk.bold.red(error)); 
      }); 
    } 

Dies ist der Code, den ich Transaktionen auf dem Hauptbuch machen kann:

makeTransaction(fromID, toID, funds) { 
     const METHOD = 'makeTransaction'; 
     let from; 
     let walletRegistry; 
     let to; 

     return this.businessNetworkConnection.getAssetRegistry('org.acme.Wallet') 
      .then((registry) => { 
       console.log(1); 
       walletRegistry = registry; 
       return walletRegistry.get(fromID); 
      }) 
      .then((fromm) => { 
       console.log(2); 
       from = fromm; 
       return walletRegistry.get(toID); 
      }) 
      .then((too) => { 
       to = too; 
      }) 
      .then(() => { 
       let serializer = this.businessNetworkDefinition.getSerializer(); 
       let resource = serializer.fromJSON({ 
        "$class": "org.acme.Transfer", 
        "amount": funds, 
        "from": { 
         "$class": "org.acme.Wallet", 
         "id": from.getIdentifier(), 
         "balance": from.balance, 
         "owner": "resource:org.acme.Client#" + from.owner.getIdentifier() 
        }, 
        "to": { 
         "$class": "org.acme.Wallet", 
         "id": to.getIdentifier(), 
         "balance": to.balance, 
         "owner": "resource:org.acme.Client#" + to.owner.getIdentifier() 
        } 
       }); 

       return this.businessNetworkConnection.submitTransaction(resource); 
      }) 
      .catch(function (error) { 
       throw (error); 
      }) 
    } 

Aber die Funktion, die jetzt die Transaktion wie folgt geschehen Aussehen macht .

static transfer(fromID, toID, funds) { 
     let bm = new BlockchainManager(); 
     return bm.init() 
      .then(() => { 
       return bm.makeTransaction(fromID, toID, funds); 
      }) 
      .then(() => { 
       console.log('Success!'); 
      }) 
      .catch(function (error) { 
       console.log('An error occured: ', chalk.bold.red(error)); 
       process.exit(1); 
      }); 
    } 

Ich glaube nicht, dies der beste Weg ist, eine Menge von Transaktionen zu machen (ich bin auf der Suche mehr als 1000 pro Sekunde zu einem bestimmten Zeitpunkt laufen). Was wäre der beste Weg dies zu programmieren?

+0

In Bezug auf 'walletRegistry',' from' und 'to', siehe [Wie kann ich auf vorherige Versprechen Ergebnisse in einer' .then() 'Kette zugreifen?] (https: //stackoverflow.com/q/28250680/1048572) – Bergi

+0

Wo ist die Schleife? Was ist "ziemlich schnell" (was hast du gemessen)? Was kann Ihrer Meinung nach verbessert werden? Haben Sie Profiling gemacht, wissen Sie, was der Engpass ist? – Bergi

+0

Sind BlockChainManager wiederverwendbar? Wenn dies der Fall ist, ziehen Sie es in Betracht, einen Pool von ihnen zu erstellen, anstatt für jede Übertragung neu zu erstellen und zu initialisieren. Ich bin sicher, dass es ein passendes Standard-Paradigma für die Verwaltung des Pools geben muss ... –

Antwort

0

können Sie tun.

let all_promise = []; 
/* 
* your loop here 
* for(let i = 0; i < am ; I++){ 
* all_promise.push(transfer(i,i+1,i*29); 
* } 
*/ 
Promise.all(all_promise).then(arr => { 
     // arr is the map arr of all the promises that "transfer()" method returned 
     // you can Iterate the arr since its the resolve value of all the promises that was push from all_promise . you need to refactor big time in your code. 
}) 

ich kommentieren Sie einfach die for-Schleife für Sie eine Idee haben .. die Idee dafür ist Sie alle Versprechen schieben, die noch nicht in ein Array lösen dann das Array übergeben an die Promise.all die dann Teil ist das Array der Auflösungswerte

+0

Das war es! Danke –

+0

Gern geschehen. –

0

Haben Sie versucht, Promise.all zu verwenden? Ich denke, ist Werke wie:

Promise.all([asyncFunc1(), asyncFunc2(), asyncFunc3(),... ]) 
.then(function(result){...}) 
.catch(function(error){...}); 

Die .then() aufgerufen wird, wenn alle Versprechungen wurden gelöst.

+0

Was ich normalerweise tun würde, ist ein 'for (let i = 0; i

+0

Ich denke, die Bluebird-Implementierung von Versprechen ist angeblich (?) Leistungsfähiger, wenn Sie sich um Geschwindigkeit kümmern ... egal, ihr Beispiel mit 'writefileAsync' scheint in die richtige Richtung zu zeigen: http://bluebirdjs.com/docs/api /promise.all.html Sie haben auch ein Versprechen. Join: http://bluebirdjs.com/docs/api/promise.join.html Darüber hinaus bin ich kein Experte in der Bereitstellung dieser für Ihren Fall. Vielleicht ist eine For-Schleife wirklich _is_ schneller, wer weiß ... – yen