Intento obtener contenido con una llamada asíncrona y obtengo la respuesta a través de una función asíncrona. ¿Qué tiene de malo esta configuración? ¿El resultado del registro de la consola siempre está indefinido?
_json: function (callback) { var xobj = new XMLHttpRequest(); xobj.overrideMimeType("application/json"); xobj.open('GET', this.options.url, true); xobj.onreadystatechange = function () { if (xobj.readyState == 4 && xobj.status == "200") { callback(xobj.responseText); } }; xobj.send(null); }, get: async function () { var resp = await this._json(function(response) { return JSON.parse(response); }); console.log(resp); }Su función _json no es una Promesa. Utiliza un patrón de devolución de llamada común para devolver información de forma asíncrona. Primero debe envolverlo en una Promesa, si desea usar la sintaxis async/await.
new Promise((resolve) => this._json((response) => resolve(JSON.parse(response))) Luego puede await y recibir JSON analizado (como espera).
Para usar async / await , necesita saber cuándo usar await en primer lugar. No puedes poner simplemente await delante de algo y esperar que de alguna manera espere algo.
Entonces, ¿cuándo debería usar await o digamos cuándo tiene sentido usarlo?
Una pregunta sencilla:
await delante de él.awaitPodemos hacer esa verificación en su problema:
¿ this._json() devuelve una promesa?
En tu caso no . Eso significa que usar await es inútil.
Lo que puedes hacer es devolver una promesa:
_json: function () { return new Promise((res, rej) => { var xobj = new XMLHttpRequest() xobj.overrideMimeType('application/json') xobj.open('GET', this.options.url, true) xobj.onreadystatechange = function () { if (xobj.readyState == 4 && xobj.status === 200) { res(xobj.responseText) } else { rej('Something went wrong') } } xobj.send(null) }) }, get: async function () { var resp = await this._json() console.log(resp) }, this._json() devuelve una Promesa ahora. En este caso, tiene sentido usar await .
Recuerde: al poner async delante de una función, su función también devuelve una promesa.