App ruft Metamask zweimal auf, wenn ich möchte, dass sie einmal aufgerufen wird

Ich habe zwei Funktionen,

Eine, die web.eth.sendTransaction zurückgibt, die zum ersten Mal eine Metamaske auslöst,

Und eine, die contractInstance.function zurückgibt, die ein Array in meinem Vertrag aktualisiert. Was auch Metamask auslöst.

Beide sind in meiner app.js in der gleichen großen Funktion,

Ich möchte das gleiche Ergebnis erhalten, nämlich eine Zahlung erhalten und dann das Buch im Vertrag aktualisieren, indem ich nur einmal metamask aufrufe.

Was ist die beste Vorgehensweise?

markAdopted: function(adopters, account) {
    var adoptionInstance;

    App.contracts.Adoption.deployed().then(function(instance) {
      adoptionInstance = instance;

      return adoptionInstance.getAdopters.call();
    }).then(function(adopters) {
      for (i = 0; i < adopters.length; i++) {
        console.log(adopters[i]);
        if (adopters[i] !== '0x0000000000000000000000000000000000000000') {
          $('.panel-pet').eq(i).find('button').text('Coped').attr('disabled', true);
        }
      }
    }).catch(function(err) {
      console.log(err.message);
    });
  },

  handleAdopt: function(event) {
    event.preventDefault();

    var petId = parseInt($(event.target).data('id'));
    var adoptionInstance;
    var account;
    var transactionStatus;

    web3.eth.getAccounts(function(error, accounts) {
      if (error) {
        console.log(error);
      }

      account = accounts[0];

    });

    web3.eth.sendTransaction({
      from: account,
      to: '0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
      value: '1000000000000000000'
    }, function(error, result){
    if(!error) {
        console.log(result);
        transactionStatus = true;
        if (transactionStatus) {
        App.contracts.Adoption.deployed().then(function(instance) {

        adoptionInstance = instance;

        return adoptionInstance.adopt(petId, {from: account});

      }).then(function(result) {

        return App.markAdopted();
      }).catch(function(err) {

        console.log(err.message);
      });
      } 
    }

    else {
        console.error(error);
        transactionStatus = false;
    }

  });
    }
};

Antworten (1)

Sofern Sie nicht bereit sind, diese Update-Array-Funktion kostenpflichtig zu machen und den Code zusammenzuführen, fordern Sie im Wesentlichen die Ausführung von 2 Aktionen an, für die 2 Trigger erforderlich sind.

Eine Alternative besteht darin, dass Sie ein mittleres Konto sicher im Backend verbinden, um eine Verbindung herzustellen und den zweiten Anruf auszulösen ... Leider fallen auch die Benzinkosten an.

Am besten überdenken Sie, wie der Vertrag programmiert ist, und versuchen, mit weniger Funktionsaufrufen mehr zu erreichen.

Wie würde die Tatsache, dass ich eine kostenpflichtige Funktion mache, dazu führen, dass ich nur einen Anruf habe? Ich habe nichts dagegen, eine kostenpflichtige Funktion zu haben. Ich dachte an das mittlere Konto, es macht mir nichts aus, die Benzinkosten zu tragen. Wenn Sie dazu etwas mehr Anhaltspunkt haben? Ich meine, ich würde gerne beide Optionen prüfen.
@Ilan Sendet Ihre sendTransaction tatsächlich Daten über den optionalen dataParameter? Ich empfehle Ihnen, uns den Code für die Transaktion selbst zu zeigen.
Kann ich es privat zeigen?
@Ilan Ich würde es einfach hier einfügen, damit Sie die maximale Antwort erhalten. Sofern Sie nicht etwas Revolutionäres machen, ist es ziemlich sicher, den Code, bei dem Sie Hilfe benötigen, hier abzulegen.
Ich habe den Code hinzugefügt, tatsächlich ist er nicht revolutionär, sondern nur ein angepasster Code aus einem Tutorial
Hey, gibt es Hinweise, wie Sie Ihre Ratschläge umsetzen können?