2017-10-29 10 views
0

私はNode.jsと非同期呼び出しが新ですが、複数のトランザクションを自動的に行うプログラムを構築しようとしています。まず、Hyperledger Fabricに接続して、forループを通して関数を実行します。いくつかの約束を効率的にループします。

これはかなり高速ですが、速度を大幅に向上させることを検討しています。これは、接続を開始するコードです:

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)); 
      }); 
    } 

これは私が総勘定元帳に取引を行うことができますコードです:

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); 
      }) 
    } 

しかし、今トランザクションは、このようなルックスが起こる作る機能。

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); 
      }); 
    } 

私はこれが(私はいくつかの点で毎秒1000上で実行しているよ)取引の多くを作るための最善の方法だとは思いません。これは、これをプログラムする最良の方法でしょうか?

+0

'' walletRegistry'、 'from'と' to'については、 '' .then() 'チェーンで以前の約束の結果にアクセスする方法は?](https: //stackoverflow.com/q/28250680/1048572) – Bergi

+0

ループはどこですか? 「かなり速い」とは何ですか(あなたは何を測定しましたか)?何が改善できると思いますか?プロファイリングをしましたか?ボトルネックは何ですか? – Bergi

+0

BlockChainManagersは再利用可能ですか?そうであれば、新規作成して転送ごとに初期化するのではなく、プールに描画することを検討してください。私はプールを管理するためのいくつかの適切な市販のパラダイムがなければならないと確信しています... –

答えて

0

できます。私はちょうどループのためにあなたのアイデアを持っているためコメントアウト

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. 
}) 

。これの アイデアは、あなたがしてPromise.allその後、一部にその配列を渡す、まだ配列に解決していないすべての約束を押しています解決値の配列になります

+0

これはそれでした!ありがとうございます –

+0

ようこそ。 –

0

Promise.allを使用してみましたか? 私のような作品だと思う:すべての約束は解決されたとき

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

.then()が呼び出されます。

+0

私が普通にやっていることは 'for(let i = 0; i

+0

私は、約束をブルーバードで実装した方がスピードを気にしていればより効果的だと思いますが、 'writefileAsync'を使った例は正しい方向を指しているようです:http://bluebirdjs.com/docs/api /promise.all.htmlまた、彼らはpromise.joinを持っています:http://bluebirdjs.com/docs/api/promise.join.htmlそれを超えて、私はあなたのケースでこれらを配備する方法の専門家ではありません。多分、forループは本当に速く、誰が知っていますか... – yen

関連する問題