[英]Javascript asynchronous handling without Promise and async/await
在這個問題中,我只想確認我們不能使用callback
來嚴格處理 JavaScript 中的異步任務。
例如,我們使用Promise.then
或async/await
:
myPromise().then(callback);
// or
(async () => {
const res = await myAsyncFunction();
callback(res);
})()
我看到了很多callback
示例,但他們使用了setTimeout
:
const functionWithCallback = (asyncFunction, callback) => {
asyncFunction();
setTimeout(() => {
callback();
}, 1000);
};
上面的例子對我來說不是asynchronous handling
,因為我們不知道asyncFunction()
完成的時間。 這里的1000ms
只是一個數字。
我們有什么辦法只用callback
來處理它嗎?
上面的例子對我來說不是異步處理
你是對的,回調調用的時間不取決於myAsyncFunction
是否完成了它的異步任務。 但是,在該術語的最常見用法中, setTimeout
是異步調用其回調 function ......總是。
我只是想確認我們不能使用回調來嚴格處理 JavaScript 中的異步任務。
你可以。 但是有幾點需要注意:
甚至 Promise 也適用於回調系統: then
方法接受一個回調參數,並且該回調將在 promise 完成時執行。 Promise 不會廢除回調,而是通過允許鏈接和避免“回調地獄”來更輕松地使用它們。
在 JavaScript 中提供 promise 之前,肯定已經有了異步編程的概念。
在您的示例中,您提供了 function myAsyncFunction
。 如果在異步任務完成時做出反應很重要,那么 function 肯定必須以某種方式通知該完成。
Today it is very common for such an asynchronous function to return a promise, and then the caller will of course make use of that promise (with either then
or await
): that's the purpose of having the promise object. 這種異步 function 的一個已知示例是fetch
。
如果myAsyncFunction
沒有返回 promise,那么我們希望這樣的 function 以不同的方式通知。 例如,它可以將回調作為參數。 然后代碼如下所示:
myAsyncFunction(callback);
此類異步函數的已知示例包括setTimeout
、 requestAnimationFrame
和queueMicrotask
還有其他異步函數更復雜,因為它們可能會提供一些同步結果和其他異步結果。 他們返回一個 object 可以附加一個監聽器。 然后代碼將如下所示:
let res = myAsyncFunction();
res.addEventListener("ready", callback);
在 DOM API 中有很多這樣的例子:例如document.createElement
和load
事件(通常與img
和script
元素一起使用)。
一個輕微的變化是使用new
調用構造函數,或者首先提供 object,但異步操作仍然必須由某個事件或方法調用啟動。
當然,這有很多變化,例如:
let res = new MyConstructor();
res.myAsyncFunction();
res.onready = callback;
這種構造函數的一個例子是XMLHttpRequest
(使用它的send()
方法)
這實際上取決於myAsyncFunction
將如何通知它已完成其異步任務。 當myAsyncFunction
返回 promise 時,當然您應該使用該 promise。 如果沒有,應該有一些方法可以將您的回調提供給所提供的 API。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.