[英]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.