簡體   English   中英

Javascript 異步處理,沒有 Promise 和 async/await

[英]Javascript asynchronous handling without Promise and async/await

在這個問題中,我只想確認我們不能使用callback來嚴格處理 JavaScript 中的異步任務。
例如,我們使用Promise.thenasync/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);

此類異步函數的已知示例包括setTimeoutrequestAnimationFramequeueMicrotask

還有其他異步函數更復雜,因為它們可能會提供一些同步結果和其他異步結果。 他們返回一個 object 可以附加一個監聽器。 然后代碼將如下所示:

let res = myAsyncFunction();
res.addEventListener("ready", callback);

在 DOM API 中有很多這樣的例子:例如document.createElementload事件(通常與imgscript元素一起使用)。

一個輕微的變化是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM