Estoy tratando de ejecutar una función, pero cuando la primera es asíncrona arroja el error function1(...) is not a function , sin embargo, si paso la función asíncrona como la última, funciona bien.
¿Puede alguien decirme por qué está pasando esto? y ¿cómo hacer correctamente una función de curry que comience con una función asíncrona?
Gracias a cualquiera que se tome el tiempo.
//This one is throwing the error: function1(...) is not a function async function function1(path) { const fetchedElement = await fetchElement(path); //(...) return (msg) => { console.log(msg); }; } function1('somepath.html')('my message'); //This one works fine, properly returning other function function function2(path) { return async (msg) => { const fetchedElement = await fetchElement(path); //(...) console.log(msg); }; } function2('somepath.html')('my message');Como la primera función es async , primero debe await y luego llamar al segundo parámetro.
//This one is throwing the error: function1(...) is not a function async function function1(path) { const fetchedElement = await Promise.resolve(1); //(...) return (msg) => { console.log(msg); }; } (async () => { try { (await function1('somepath.html'))('my message'); } catch(e) { console.log(e) } })()Depende de cuándo se debe realizar el trabajo asíncrono. Si desea que el proceso de curry haga el trabajo asíncrono, entonces no puede invocar la función de curry de forma síncrona:
curryingFunction(paramA)(paramB) ^ assumes curryingFunction is synchronousEn su lugar, use dos declaraciones de la persona que llama, una para esperar el curry, la otra para invocar...
const fetch = path => new Promise(resolve => setTimeout(() => { console.log('fetched ' + path) resolve() }, 1000)); async function curryingFunction(path) { const fetchedElement = await fetch(path); return message => { console.log(message); } } async function someCaller() { // await to get a curried function, then invoke it let curried = await curryingFunction('some_path'); curried('some message'); } someCaller()Por otro lado, es posible que no necesite hacer el trabajo asíncrono para obtener la función curry. Probablemente no. En ese caso, puede hacer que la función de curry sea síncrona, pero que devuelva una función asíncrona que haga el trabajo asíncrono.
Como resultado, podrá usar la sintaxis fn()() que probablemente esté acostumbrado a usar...
const fetch = path => new Promise(resolve => setTimeout(() => { console.log('fetched ' + path) resolve() }, 1000)); function curryingFunction(path) { return async (message) => { const fetchedElement = await fetch(path); console.log(message); } } async function someCaller() { // here we can use the fn()() syntax that we're accustomed to await curryingFunction('some path')('some message') } someCaller()