javascript - funciones - promesas typescript
Confundido cuando haces una promesa de setTimeout (2)
Soy nuevo en Promise. Escribí dos ejemplos:
El primero es:
new RSVP.Promise(function (resolve, reject) {
setTimeout(function () {
resolve("HI")
}, 3000);
}).then(function (result) {
console.log(result);
});
Este imprimirá "HI" después de 3 segundos como esperaba. Esto se debe a que "entonces" espera, y solo se llama cuando se establece la promesa.
El segundo es:
new RSVP.Promise(function (resolve, reject) {
resolve();
}).then(function () {
return RSVP.Promise(function (resolve, reject) {
setTimeout(function () {
resolve("HI")
}, 3000);
});
}).then(function (result) {
console.log(result);
});
Pensé que también se imprimiría "HI" después de 3 segundos. Pero nada pasó. Pensé que el segundo "entonces" esperaría la promesa en el primer "entonces".
¿Qué está mal para el segundo ejemplo y cómo solucionarlo?
En su segundo ejemplo tiene una función que devuelve una promesa dentro de la función then (), pero esa promesa no está expuesta al procedimiento then () entonces cuando se resuelve no hay ninguna acción para que se realice. then () realmente devuelve su propia promesa, lo que permite que el encadenamiento funcione. En el caso del segundo ejemplo, el resultado en el segundo entonces () debería ser la Promesa que devolviste en el primero, luego ()
tl; dr
Necesita construir promesas de RSVP con un new
operador.
Código fijo
new RSVP.Promise(function (resolve, reject) {
resolve();
}).then(function () {
// Note the `new` in the next line
return new RSVP.Promise(function (resolve, reject) {
setTimeout(function () {
resolve("HI")
}, 3000);
});
}).then(function (result) {
console.log(result);
}).catch(console.error);
En su caso, no estaba haciendo nada porque la creación de promesa en el manejador de then
falló, ya que no se utilizó nada new
. Dado que, el controlador de then
estaba lanzando una excepción, devolvió una promesa fallida. Es por eso que el siguiente controlador tampoco fue ejecutado.
Cuando ejecuté su código original con el controlador de catch
adjunto, como he mostrado anteriormente, recibí el siguiente error.
[TypeError: no se pudo construir ''Promise'': utilice el operador ''new'', este constructor de objetos no se puede llamar como una función.]
Regla general : utilice siempre el controlador de catch
cuando se trata de promesas.