繁体   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