javascript - page - title html español
¿De qué podría tratarse esto? (5)
Estoy haciendo algunas operaciones asíncronas básicas usando async/await
await en TypeScript pero TSLint está lanzando mensajes de error misteriosos para estas dos funciones a continuación. ¿Alguien ha encontrado estos errores antes? En la salida de error no se menciona la regla que rige, así que no entiendo qué está causando esto. Cualquier idea sería apreciada grandemente
La solicitud principal:
import * as rp from ''request-promise''
export function getRequest(address: rp.Options): rp.RequestPromise {
return rp(address)
}
Función asíncrona exportada:
export async function getStatus(message: Message) {
try {
const res = await getRequest(address)
if (res.ready) {
message.reply(''...'')
} else {
message.reply(''...'')
}
} catch (err) {
message.reply(err)
}
}
Esto se obtiene: las Promises must be handled appropriately
y await of non-Promise
para la línea # 3.
La función simple que utiliza esta exportación es:
client.on(''message'', message => {
if (message.content === ''green'') {
getStatus(message)
}
})
Esto también se consigue Promises must be handled appropriately
.
Información Adicional:
Aunque el mensaje de error no lo menciona, esta parece ser la regla que rige para las Promises must be handled appropriately
: https://palantir.github.io/tslint/rules/no-floating-promises/
Y las menciones de este Issue await of non-Promise
: https://github.com/palantir/tslint/issues/2661
A veces es posible que desee hacer una promesa, pero no necesita hacer nada con la respuesta. Un cambio de ruta o algo más.
así que en lugar de
promiseFunction().then().catch()
try/catch async/await
tu puedes hacer:
void promiseFunction();
Creo que este problema se puede solucionar con la espera de la función getStatus , ya que es una función asíncrona. El mensaje lo dice claramente, pero el número de línea causa confusión. Para ser honesto también me tomó algo de tiempo.
Puede resolver este error de pelusa por este cambio en el código:
client.on(''message'', message => {
if (message.content === ''green'') {
await getStatus(message)
}});
En mi opinión, no es una buena idea desactivar estos errores específicos. Son útiles porque de otra manera no ejecutarías el código asíncrono.
Ese es un mensaje de error horrible. Una mejor podría ser,
Cada expresión de tipo Promise
debe terminar con una llamada a .catch
o una llamada a .then
con un controlador de rechazo ( source ).
Así, por ejemplo, si lo haces
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log(''this will succeed''))
entonces todavía tendrá un problema de tslint, porque el tipo de .then(...)
es una promesa, y tiene que terminar con una trampa. La solución sería .catch
una cláusula .catch
, por ejemplo,
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log(''this will succeed''))
.catch(() => ''obligatory catch'')
o simplemente deshabilitando tslint para esa línea a través de:
PromiseFunction()
.catch(err => handle(err))
// tslint:disable-next-line:no-unsafe-any
.then(() => console.log(''this will succeed''))
Alternativamente, puede invertir el orden de las declaraciones .then
y .catch
. Sin embargo, eso impide que el .then
ejecute si se produce un error, lo que presumiblemente querrá si encuentra este problema.
Su función getStatus
está definida para devolver una promesa:
// All functions marked as async returns a promise:
async function getStatus(message: Message) {/* ... */}
Pero getStatus
sin llamar es entonces:
getStatus(message)
Por lo tanto, el compilador piensa que has olvidado manejar tu código asíncrono. Todo lo que necesitas hacer es llamar a .then()
:
getStatus(message).then(() => console.log(''done''));
Tengo la misma excepción cuando he creado firebase-function
base de firebase-tool
usando firebase-tool
base de firebase-tool
const ref = admin.database().ref("path/to/database/object");
ref.once("value").catch(error =>{ // line 22
response.send( error() );
}).then( snapshot =>{
response.send( snapshot.val );
})
Este código no se compila y return
ERROR: /src/index.ts[22, 5]: Promises must be handled appropriately
He cambiado los lugares de catch
y then
.
ref.once(...).then(...).catch(...)
Este código es trabajo, lo siento pero no tengo ninguna explicación.
Tanto asombroso cuando la aplicación devuelve algún error sin bloqueo incluso según el firebase doc
no mencionado, se requiere catch
.