typescript - Promise som bara returnerar?
Jag lade märke till följande i kodbasen jag för närvarande arbetar med och är inte säker på vad poängen med det är:
public spinnerPromise: Promise<void> = new Promise<void>(() => { return; });Finns det en anledning att ha ett tomt Promise? Detta påminner mig om att göra en setTimeOut(fn, 0) och jag undrar om det har en liknande effekt.
Tack
Svar #1
Redigera
Som @Bergi påpekade, uppfylls det givna löftet aldrig eftersom ingen kallar på resolve. Så löftet i fråga kommer aldrig att kalla någon som väntar på resultatet.
Ett löfte motsvarande en setTimeOut(fn, 0) skulle vara:
var spinnerPromise: Promise<void> = new Promise<void>(resolve => resolve());
Original
Ja, effekten är liknande. Promise-specifikationen kräver att även om Promise är i det uppfyllda tillståndet, kommer ingen hanterare att anropas direkt när hanteraren registreras. Den kommer att anropas först när det nuvarande anropet har avslutats.
spinnerPromise.then (()=> { /* Code called later */ });
// Code called after call to then
Svar #2
Finns det någon anledning att ha ett tomt löfte?
Jag kan inte komma på många. Ett användningsfall skulle vara som ett värde som du kan skicka till Promise.race och förvänta dig att det alltid väljer det andra alternativet.
Ta en titt på Är JavaScript alltid väntande löften dåliga? och Är det säkert att inte lösa eller avvisa ett löfte.
Detta påminner mig om att göra en
setTimeOut(fn, 0)och jag undrar om det har en liknande effekt.
Nej, inte alls. setTimeout kommer så småningom att anropa callbacken, men new Promise(() => {}).then(…) kommer aldrig att göra det. Det är mer likt att skicka Infinity till setTimeout (vilket egentligen inte fungerar i verkligheten).
Du kanske tänker på Promise.resolve().then(…) eller new Promise(r => r()).then(…), vilket kommer att anropa återanropsfunktionen omedelbart men asynkront.
