Quiero asignar el valor dentro de una función de devolución de llamada a una variable fuera de ella. Aquí hay un ejemplo con child_process
.
let variable; require('child_process').spawn('python', ['./hello.py']).stdout.on('data', data => { variable = data.toString(); console.log(variable); }); console.log(variable);
print('Hello World')
undefined Hello World
Sé que el archivo console.log en la parte inferior se ejecuta antes de la función de devolución de llamada y, por lo tanto, la variable aún no está definida. Pero, ¿cómo podría esperar a que la función de devolución de llamada termine primero?
Las promesas parecen ser la respuesta óptima y el código debe ser asíncrono.
async function test() { const promise = new Promise((resolve, reject) => { require('child_process').spawn('python', ['./test.py']).stdout.on('data', data => { resolve(data.toString()); }); }); return promise; } (async function () { let variable; await test().then(res => { variable = res; }); console.log(variable); }())
Puede usar una promesa de esperar la devolución de llamada como en este ejemplo:
let data; const myPromise = new Promise((resolve, reject) => { setTimeout(() => { data="abc"; resolve('foo'); }, 300); }); myPromise.then((res)=>{console.log(data+res)})
esto imprimirá "abcfoo"
A menudo, la mejor manera de esperar algo asíncrono es tener un código asíncrono usted mismo.