Escribiendo una función que crea y devuelve una promesa.
Ejecute una función determinada (devolución de llamada) después de un retraso. Sin embargo:
const doShortlyExpectingTruthy = function(callback, delay, data) { const promise = new Promise((resolve, reject) => { let returnValue = setTimeout(callback, delay, data); if (returnValue) { resolve(returnValue); } else if (!returnValue) { reject("Falsy value"); } }); return promise; };¿Puedo saber cómo solucionar este error de afirmación no detectado?
El valor de retorno de setTimeout es una identificación de número entero que se usa para cancelar el tiempo de espera, no el valor de retorno de la devolución de llamada. Si setTimeout funcionara sincrónicamente de esta manera, no habría necesidad de la promesa.
Desglosaría una función de sleep genérica para mantener el new Promise fuera de su código, luego usaría async / await . throw una función async es lo mismo que llamar a reject .
const sleep = ms => new Promise(res => setTimeout(res, ms)) ; const doShortlyExpectingTruthy = async (fn, delay, ...args) => { await sleep(delay); const res = fn(...args); if (!res) { throw Error("Falsy value retrieved"); } return res; }; (async () => { console.log(await doShortlyExpectingTruthy(v => v, 1000, 42)); await doShortlyExpectingTruthy(v => v, 1000, 0); })() .catch(err => console.error(err)) ;