w3schools tag tab page change javascript promise ecmascript-6 es6-promise

javascript - tag - title of page html



¿Las promesas pendientes de JavaScript son malas? (2)

No debería haber ningún efecto secundario. Sería un error del navegador si una Promise no referenciada en cualquier estado mantiene los recursos.

Solo asegúrate de no guardar ninguna referencia al objeto Promise y estarás bien.

Tenga en cuenta que ciertas API, como setTimeout , mantendrán una referencia al cierre hasta el valor de tiempo de espera. Esto significa que si tiene un tiempo de espera prolongado, como el 10s uno, debe borrarlo tan pronto como ya no lo necesite. De lo contrario, su código puede llamar a miles de setTimeout dentro de 10 setTimeout , y cada uno de ellos mantendrá una referencia al cierre, que en su caso hará referencia a la Promise .

Digamos que tengo una promesa llamada myProm , y digo que tengo éxito y los manejadores de errores llamados onSuccess y onError .

Siempre que mi promesa tarde más de 10 segundos en completarse, quiero que se ejecute una función llamada timeoutHandler , pero si eso ocurre, ni onSuccess ni onError deberían ejecutarse. (De manera similar, si se onSuccess o onError , no quiero que se timeoutHandler mi timeoutHandler ).

He creado el siguiente fragmento para esto.

new Promise((suc, err) => { let outOfTime = false; const timeoutId = window.setTimeout(() => { outOfTime = true; timeoutHandler(); }, 10000); myProm.then( (...args) => { if (!outOfTime) { window.clearTimeout(timeoutId); suc(...args); } }, (...args) => { if (!outOfTime) { window.clearTimeout(timeoutId); err(...args); } } ); }).then(onSuccess, onError);

Sin embargo, en caso de un tiempo de espera, mi promesa recién definida quedará pendiente por siempre. ¿Podría esto tener algún efecto secundario negativo? Por ejemplo, el tiempo de ejecución no puede limpiar el objeto Promesa porque todavía está pendiente (o algo similar).


Puede usar Promise.race() , establecer timeoutHandler como una función que devuelve un Promise rechazado en diez segundos, de lo contrario, onSuccess debe onSuccess en la Promise de myProm

function myProm() { return new Promise((success, err) => { setTimeout(() => { success("myProm") }, Math.floor(Math.random() * 11000)) }) } function timeoutHandler() { return new Promise((_, timeout) => { setTimeout(() => { timeout(new Error("timeoutHandler")); }, 10000) }) } function onSuccess(data) { console.log("success", data) } function onError(err) { console.log("err:", err) } function onTimeout(e) { if (e.message && e.message === "timeoutHandler") { console.log(e.message + " handled"); } else { onError(e) } } Promise.race([myProm(), timeoutHandler()]) .then(onSuccess, onTimeout);

plnkr http://plnkr.co/edit/9UD5syOEOc1oQGdRTRRm?p=preview