Node.js no puede acceder a VAR en subfunción [duplicado] -- javascript campo con node.js camp Relacionados El problema

Node.js can't access var in subfunction [duplicate]


0
vote

problema

Español
Esta pregunta ya tiene respuestas aquí :
¿Por qué mi variable está inalterada después de ¿Lo modificé dentro de una función? - Referencia de código asíncrono (6 respuestas)
Cerrado hace 10 meses .

Con la siguiente función, estoy tratando de calcular el precio total de un pago. Pero si i console.log () la variable antes de que se devuelva, obtengo 0. Si i i si i console.log () la variable en la función Findone (), obtengo el valor correcto.

Como base de datos I Uso MongoDB y "Artículo" es un modelo.

  function calculateOrderAmount(items) {   var totalPayment=0;   items.forEach((item) => {     Item.findOne( { _id: item } )       .then(item => {           if(item) {             // Item exists             totalPayment = item.price;             console.log(totalPayment);           }       });   });   console.log(totalPayment);   return totalPayment; }   

Estoy desesperado por eso y realmente no sé qué buscar en Internet. Muchas gracias por las respuestas de antemano.

Original en ingles

With the following function I am trying to calculate the total price of a checkout. But if I console.log() the variable before it is returned, I get 0. If I console.log() the variable in the findOne() function, I get the correct value.

As database I use MongoDB and "Item" is a model.

function calculateOrderAmount(items) {   var totalPayment=0;   items.forEach((item) => {     Item.findOne( { _id: item } )       .then(item => {           if(item) {             // Item exists             totalPayment = item.price;             console.log(totalPayment);           }       });   });   console.log(totalPayment);   return totalPayment; } 

I'm desperate about it and I don't really know what to look for on the internet. Many thanks for answers in advance.

     
 
 

Lista de respuestas

0
 
vote

Item.findOne es una operación de ASYNC, por lo que en su código ejecute:

  • var totalPayment = 0
  • items.forEach((item) => {...
  • console.log(totalPayment)
  • return totalPayment
  • Otro código de sincronización que llamó calculateOrderAmount
  • luego la devolución de llamada de filter { csv { separator => " " columns => [ 'garbage1', 'good', 'garbage2', 'garbage3', 'garbage4' ] source => "message" } } 0 se ejecuta

Debe usar una función de llamada de devolución de llamada o una función 9988777661111 como esta:

  filter {   csv {     separator => "      "     columns => [ 'garbage1', 'good', 'garbage2', 'garbage3', 'garbage4' ]     source => "message"   } } 2  
 

Item.findOne is an async operation, so in your code you execute:

  • var totalPayment = 0
  • items.forEach((item) => {...
  • console.log(totalPayment)
  • return totalPayment
  • other sync code who called calculateOrderAmount
  • then the callback of Item.findOne is run

You must use a callback sytle or an async function like this:

async function calculateOrderAmount (items) {   // beware: if you have a huge items list, doing so could lead to high memory usage   const itemsPromises = items.map((item) => {     return Item.findOne({ _id: item })     .then(item => {       if(item) {         // Item exists         return item.price;       }       return 0     });   })    const prices = await Promise.all(itemsPromises)   const totalPayment = prices.reduce((a, b) => a + b, 0)   console.log(totalPayment)   return totalPayment } 
 
 

Relacionados problema

0  ¿Generar HTML o cargarlo en el mundo nodejs?  ( Generate html or load it in nodejs world ) 
Soy nuevo en el mundo de los Nodos, una pregunta noob para usted: usamos HAML, EJS, ... para generar archivos HTML. ¿Podemos cargar nuestro propio archivo HTM...

0  Async.achseries me da una gama: la pila de llamadas máxima excedida  ( Async eachseries gives me an rangeerror maximum call stack exceeded ) 
Quiero iterar más de 4435 productos en una colección. Para cada producto quiero descargar la imagen y subirlo a un cubo de Amazon S3. Para la última parte he ...

2  Nede.js Web Sockets Server: ¿Es mi idea para la gestión de datos estable / escalable?  ( Node js web sockets server is my idea for data management stable scalable ) 
Estoy desarrollando un RPG multijugador de HTML5 Browser con NODE.JS que se ejecuta en el backend con un complemento de sockets web para la transferencia de d...

0  ¿Qué está mal con mi promesa, la función ASYNC / AWAIT está devolviendo las matrices vacías?  ( Whats wrong with my promise async await function both are returning empty arrays ) 
Tengo una variedad de objetos en mi código que se muestra a continuación [ { name: 'JMCP', priority: 1 }, { name: 'OTC', priority: 2 }, { name: 'CMT', ...

6  Nodejs y nodo-mongodb-nativo  ( Nodejs and node mongodb native ) 
Acabando de comenzar con nodo, y tratar de obtener el controlador Mongo trabajar. Tengo mi conexión configurada, y extrañamente puedo insertar cosas. Sólo bie...

122  NODEJS - Redireccionar URL  ( Nodejs redirect url ) 
¿Cómo obtengo un servidor node.js para redirigir a los usuarios a una página 404.html cuando ingresan una URL no válida? Hice algunas buscando, y parece que...

14  Heroku Server se bloquea con "JavaScript Monthip Out of Memory" al desplegar la aplicación 'react-admin'  ( Heroku server crashes with javascript heap out of memory when deploying react ) 
Actualmente estoy desarrollando un panel de administración usando 'react-admin' que funciona bien en mi local, pero tan pronto como subo la aplicación a Herok...

2  Cargando datos de búfer de la base de datos como PDF  ( Loading buffer data from database as pdf ) 
He estado desarrollando una aplicación web donde el usuario puede cargar un archivo PDF y luego lo recupere y lo vea. Lo que he estado haciendo para lograrlo ...

0  Cómo convertir la fecha de ISI a ISO en JS  ( How to convert isi date to iso in js ) 
Estoy recibiendo la fecha como data.created = "Wed May 03 2017 15:41:49 GMT 0530(IST)" quiero convertirlo a Formato de ISI regular como 2017-03...

498  Nodo / Express: Eadrinuse, dirección ya en uso - Matar al servidor  ( Node express eaddrinuse address already in use kill server ) 
Tengo un servidor simple que se ejecuta en NOde.js usando Conectar: ​​ var server = require('connect').createServer(); //actions... server.listen(3000); ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos