為不傳回任何內容的函數建立Promise 的任務,例如setTimeout,最初可能具有挑戰性。為了理解這個概念,讓我們參考修改後的程式碼範例:
<br>function async(callback){<pre class="brush:php;toolbar:false">setTimeout(function(){ callback(); }, 5000);
}
async(function(){
console.log('async called back');
});
我們的目標是產生一個承諾,一旦setTimeout回呼完成,非同步就可以回傳
使用原生Promise,我們可以建立一個稍後呼叫的函數,如下:
<br>稍後運行(延遲) {<pre class="brush:php;toolbar:false">return new Promise(function(resolve) { setTimeout(resolve, delay); });
}
此函數會延遲(以毫秒為單位),並傳回一個在延遲到期後解析的 Promise。
< ;h3>帶有值的基本延遲
至稍後修改並允許它傳遞解析度值,我們需要確保 setTimeout 回呼接收該值作為參數。對於支援向 setTimeout 提供額外參數的瀏覽器,可以使用以下程式碼:
<br>function later(delay, value) {<pre class="brush:php;toolbar:false">return new Promise(function(resolve) { setTimeout(resolve, delay, value); });
}
此程式碼確保該值傳遞給回調並隨後由
對於我們想要提供取消逾時功能的情況,我們可以建立一個有cancel 方法的對象,並Promise 的存取器。當呼叫cancel方法時,它會清除逾時並拒絕promise:
<br>const later = (delay, value) =>; {<pre class="brush:php;toolbar:false">let timer = 0; let reject = null; const promise = new Promise((resolve, _reject) => { reject = _reject; timer = setTimeout(resolve, delay, value); }); return { get promise() { return promise; }, cancel() { if (timer) { clearTimeout(timer); timer = 0; reject(); reject = null; } } };
};
此方法提供了一種取消待處理超時並拒絕相關承諾的方法。
以上是如何將 setTimeout 函數變成 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!