Rechazo de promesa no manejado

El código a continuación me da el error de transacción que excede la asignación o siempre falla, pero cuando reviso mi contrato en remix, puedo ver que la transacción se lleva a cabo, hace los cambios de estado correctos y funciona como se esperaba. En La asignación executionMetricsse vuelve indefinida. He estado sentado tratando de resolver el problema durante 4 horas y estoy completamente atascado. ¿Alguien sabe lo que está pasando?

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

La función de contrato inteligente invocada:

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

Registro de errores:

(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)
Su código no tiene ningún sentido con respecto a su pregunta. awaitSolo se puede usar dentro de una asyncfunción. La primera línea de código en su pregunta no cumple con esa regla. Y dado que su pregunta es específicamente acerca de que esta tarea se vuelve indefinida, debe explicar exactamente cómo está haciendo las cosas. ¡Este código ni siquiera comenzará a ejecutarse!
Oh, lo siento, estos son solo fragmentos de código. Pensé que publicar todo sería demasiado complicado. Soy consciente de que await solo funciona en funciones asíncronas
Por supuesto, no debe publicar todo, solo lo que es relevante para su pregunta. Pero este manejo específico ES muy relevante.
Actualicé mi publicación. Esperemos que el manejo específico sea más claro ahora.
¡No está llamando a la función someAsyncFuncen ninguna parte de su código! Incluso si lo hizo, no está devolviendo nada, no está asignando ninguna variable no local. Entonces, ¿cuál es exactamente el propósito de esta función y cómo espera que la variable local executionMetricstenga algún significado fuera de ella?
Esto no parece un problema relacionado con Ethereum, sino un problema puro de Javascript (o más precisamente, un problema de conceptos básicos de programación). Una función no se ejecuta a menos que la llame explícitamente. No devolverá nada a menos que agregue una returndeclaración explícitamente en cada ruta de ejecución dentro de esa función. Una variable local no tiene significado fuera de la función en la que se declara.
Tienes razón, de hecho, esto fue solo un error de programación javascript/básico y finalmente lo hice funcionar de la manera que pretendía.

Respuestas (1)

Como goodvibration señaló en sus comentarios, esto no fue un problema de ethereum o web3, sino un error de programación javascript/básico puro. El gran error en el código fue regresar en la then()declaración y asumir que sería el valor de retorno de executePromises(). Ese no era el caso y lo he corregido.