Unbehandelte Ablehnung des Versprechens

Der folgende Code gibt mir die Überschreitungsgrenze oder den immer fehlgeschlagenen Transaktionsfehler, aber wenn ich meinen Vertrag auf Remix überprüfe, kann ich sehen, dass die Transaktion durchläuft, die richtigen Statusänderungen vornimmt und wie erwartet funktioniert. In Die Zuordnung executionMetricswird undefiniert. Ich habe 4 Stunden lang versucht, das Problem herauszufinden, und ich stecke völlig fest. Weiß jemand was los ist?

async function someAsyncFunc(){
  bookingPromiseArr = []
  let promise = instance.methods.bookTrip(tripKey).send({
    from: accounts[0],
    gasPrice: GAS_PRICE,
    value: 1,})
  bookingPromiseArr.push(promise)
  let executionMetrics = await executePromises(bookingPromiseArr, txStartTime)
}

async function executePromises(promisesArr, txStartTime) {
  await Promise.all(promisesArr)
    .then((receipts) => {
      let totalGasUsed = 0
      let txElapsedTime = Date.now() - txStartTime
      let lastBlock = receipts[receipts.length - 1].blockNumber
      receipts.forEach((receipt) => {
        totalGasUsed += receipt.gasUsed
        lastBlock =
          receipt.blockNumber > lastBlock ? receipt.blockNumber : lastBlock
      })
      // I've console logged here and seen that I've reached this point
      return {
        txElapsedTime: txElapsedTime,
        totalGasUsed: totalGasUsed,
        lastBlock: lastBlock,
      }
    })
    .catch((error) => {
      console.log('multipleTX():', error)
      process.exit(1)
    })
}

Die aufgerufene Smart-Contract-Funktion:

function bookTrip(uint256 key) external payable requireTrip(key) nonBookedPassenger(key){
        Trip storage trip = trips[key];
        trip.passengers[msg.sender] = trip.price;
        trip.passengerCount++;
        emit LogNewTripPassenger(msg.sender, key, trip.price);
    }

Fehlerprotokoll:

(node:23524) UnhandledPromiseRejectionWarning: Error: gas required exceeds allowance (8000029
) or always failing transaction
    at C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\node_modules\@truffle\hdw
allet-provider\node_modules\web3-provider-engine\subproviders\provider.js:18:36
    at XMLHttpRequest.request.onreadystatechange (C:\Users\Diddi\Documents\mjukvaruteknik\exa
mensarbete\tqdt33\node_modules\web3-providers-http\src\index.js:96:13)
    at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\Diddi\Documents\mjukvaruteknik\exame
nsarbete\tqdt33\node_modules\xhr2-cookies\xml-http-request-event-target.ts:44:13)
    at XMLHttpRequest._setReadyState (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\t
qdt33\node_modules\xhr2-cookies\xml-http-request.ts:219:8)
    at XMLHttpRequest._onHttpResponseEnd (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbe
te\tqdt33\node_modules\xhr2-cookies\xml-http-request.ts:345:8)
    at IncomingMessage.<anonymous> (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqd
t33\node_modules\xhr2-cookies\xml-http-request.ts:311:39)
    at IncomingMessage.emit (events.js:228:7)
    at endReadableNT (_stream_readable.js:1185:12)
    at processTicksAndRejections (internal/process/task_queues.js:81:21)
(node:23524) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error origin
ated either by throwing inside of an async function without a catch block, or by rejecting a
promise which was not handled with .catch(). (rejection id: 1)
(node:23524) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In th
e future, promise rejections that are not handled will terminate the Node.js process with a n
on-zero exit code.
TypeError: Cannot read property 'txElapsedTime' of undefined
    at multipleTx (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\client\cl-int
eraction\contractInteract.js:65:24)
    at processTicksAndRejections (internal/process/task_queues.js:94:5)
    at test (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\client\cl-interacti
on\profile1.js:26:5)
Ihr Code ergibt in Bezug auf Ihre Frage keinen Sinn. awaitSie können nur innerhalb einer Funktion verwenden async. Die erste Codezeile in Ihrer Frage hält sich nicht an diese Regel. Und da Ihre Frage speziell darauf abzielt, dass diese Zuordnung undefiniert wird, müssen Sie genau erklären, wie Sie die Dinge tun. Dieser Code wird nicht einmal gestartet!
Oh, tut mir leid, das sind nur Codeschnipsel. Ich dachte, das alles zu posten wäre einfach zu chaotisch. Mir ist bewusst, dass await nur in asynchronen Funktionen funktioniert
Natürlich sollten Sie nicht alles posten, sondern nur das, was für Ihre Frage relevant ist. Aber diese spezifische Handhabung IST sehr relevant.
Ich habe meinen Beitrag aktualisiert. Hoffentlich ist die spezifische Handhabung jetzt klarer
Sie rufen die Funktion someAsyncFuncnirgendwo in Ihrem Code auf! Selbst wenn Sie dies getan haben, gibt es nichts zurück und weist keine nicht-lokalen Variablen zu. Was genau ist also der Zweck dieser Funktion, und wie erwarten Sie, dass die lokale Variable executionMetricsaußerhalb davon eine Bedeutung hat???
Dies scheint kein Problem im Zusammenhang mit Ethereum zu sein, sondern ein reines Javascript-Problem (oder genauer gesagt ein Problem mit grundlegenden Programmierkonzepten). Eine Funktion wird nicht ausgeführt, wenn Sie sie nicht explizit aufrufen. Es wird nichts zurückgegeben, es sei denn, Sie fügen returnin jedem Ausführungspfad innerhalb dieser Funktion explizit eine Anweisung hinzu. Eine lokale Variable hat außerhalb der Funktion, in der sie deklariert ist, keine Bedeutung.
Sie haben Recht, das war tatsächlich nur ein Javascript-/Grundlegender Programmierfehler und ich habe es endlich so hinbekommen, wie ich es beabsichtigt hatte.

Antworten (1)

Wie goodvibration in seinen Kommentaren betonte, war dies kein Ethereum- oder Web3-Problem, sondern ein reiner Javascript-/Grundlegender Programmierfehler. Der große Fehler im Code war die Rückgabe in der then()-Anweisung und die Annahme, dass dies der Rückgabewert für wäre executePromises(). Das war nicht der Fall und ich habe es korrigiert.