Estoy utilizando la API de Docuware para engrapar (combinar) documentos. Escribí mi pregunta de la manera más simple posible para que las personas sin conocimiento de Docuware puedan entenderla.
Entonces, en mi función principal, llamo a otra función y verifico el valor de retorno de la función llamada. Si el valor es igual a cero, debería devolver un valor nulo, lo que significa que el resto de la función no debería ejecutarse.
const lastStored = await searchDocument("Invoice", ORDER_NUMBER = '', cookie) console.log("Full id func: " + id) console.log("id[0]: " + id[0]) if (lastStored[0] === 0) { console.log("id[0]: " + id[0]) return null; };Recibo errores extraños con mi código, por lo que tengo muchos registros de consola. Aquí están los console.logs cuando el código funciona correctamente.
cookie set Document is Invoice (Invoice) Invoice order #: ORD83001 Current ID: 52724 Order #: ORD83001 cookie set Document is DELIVERY SLIP (DELIVERY SLIP) Invoice order #: ORD83001 DELIVERY SLIP Doc ID: 52553 Current ID: 52553 Order #: ORD83001 Full id func: 52553,ORD83001 id[0]: 52553 New Tray Doc ID: 1410 Document's successfully merged.Ahora, con el error, los registros de consola son:
//..... Current ID: 0 Order #: ORD83009 Full id func: 0,ORD83009 id[0]: 0 id[0]: 0 Document's successfully merged.Lo que pasa con este error es que si id[0] fuera realmente cero, entonces el documento no podría fusionarse. Pero los documentos ESTÁN fusionados si los miro. Entonces, ¿por qué mi código devuelve 0, incluso DENTRO de mi declaración if, pero continúa ejecutándose?
¿Es algún tipo de problema de tiempo? Me gusta id[0] === 0 pero .00000001 segundos más tarde se actualiza para que el retorno nulo no siga adelante.
Esto sucede porque tiene una await entre la parte del código donde return null y donde se realiza la salida de "Documento fusionado con éxito".
Cada await es un punto en su código donde se suspende un contexto de ejecución. Dependiendo de la promesa esperada, habrá un tiempo en el futuro donde la ejecución suspendida se reanudará nuevamente. Esto puede conducir a sorprendentes secuencias de salida.
Aquí hay una demostración simple de este efecto. Observe cómo la salida en el bloque if es seguida por la salida debajo de él. Sería un error concluir que la return de alguna manera no "funcionó". Lo hizo, pero hubo otra ejecución de esta función que se suspendió (esperando que se resolviera una promesa) y se restauró solo para hacer ese resultado final:
const something = i => new Promise(resolve => setTimeout(resolve, i * 1000)); async function demo(i) { console.log("test the value of i"); if (i == 1) { console.log("i is one, so we exit"); return null; } await something(i); console.log("performed the action"); } demo(0); demo(1);