Heim  >  Artikel  >  Web-Frontend  >  Die Grundkonzepte von Asynchronität und Rückruf in JavaScript und das Phänomen der Rückrufhölle

Die Grundkonzepte von Asynchronität und Rückruf in JavaScript und das Phänomen der Rückrufhölle

WBOY
WBOYnach vorne
2022-08-17 18:05:251629Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Javascript. Er stellt hauptsächlich die Grundkonzepte von Asynchronität und Rückruf in JavaScript sowie das Phänomen der Rückrufhölle vor Schauen wir uns gemeinsam den Kerninhalt an. Ich hoffe, er wird für alle hilfreich sein.

Die Grundkonzepte von Asynchronität und Rückruf in JavaScript und das Phänomen der Rückrufhölle

【Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend

JavaScript asynchron und Rückruf

1. Vorwort

Bevor wir den Inhalt dieses Artikels lernen, müssen wir ihn zunächst verstehen Konzept der Asynchronität. Das erste, was hervorzuheben ist, ist, dass es einen wesentlichen Unterschied zwischen Asynchronität und Parallelität gibt.

  • Parallel bezieht sich im Allgemeinen auf paralleles Rechnen, was bedeutet, dass mehrere Anweisungen gleichzeitig ausgeführt werden können. Diese Anweisungen können auf mehreren Kernen derselben CPU oder mehreren CPU auf mehreren physischen Hosts oder sogar mehreren Netzwerken.
  • CPU的多核上,或者多个CPU上,或者多个物理主机甚至多个网络中。
  • 同步,一般指按照预定的顺序依次执行任务,只有当上一个任务完成后,才开始执行下一个任务。
  • 异步,与同步相对应,异步指的是让CPU暂时搁置当前任务,先处理下一个任务,当收到上个任务的回调通知后,再返回上个任务继续执行,整个过程无需第二个线程参与

也许用图片的方式解释并行、同步和异步更为直观,假设现在有A、B两个任务需要处理,使用并行、同步和异步的处理方式会分别采用如下图所示的执行方式:

二、异步函数

JavaScript为我们提供了许多异步的函数,这些函数允许我们方便的执行异步任务,也就是说,我们现在开始执行一个任务(函数),但任务会在稍后完成,具体完成时间并不清楚。

例如,setTimeout函数就是一个非常典型的异步函数,此外,fs.readFilefs.writeFile同样也是异步函数。

我们可以自己定义一个异步任务的案例,例如自定义一个文件复制函数copyFile(from,to)

const fs = require('fs')

function copyFile(from, to) {
    fs.readFile(from, (err, data) => {
        if (err) {
            console.log(err.message)
            return
        }
        fs.writeFile(to, data, (err) => {
            if (err) {
                console.log(err.message)
                return
            }
            console.log('Copy finished')
        })
    })
}

函数copyFile首先从参数from读取文件数据,随后将数据写入参数to指向的文件。

我们可以像这样调用copyFile

copyFile('./from.txt','./to.txt')//复制文件

如果这个时候,copyFile(...)后面还有其他代码,那么程序不会等待copyFile执行结束,而是直接向下执行,文件复制任务何时结束,程序并不关心。

copyFile('./from.txt','./to.txt')
//下面的代码不会等待上面的代码执行结束
...

执行到这里,好像一切还都是正常的,但是,如果我们在copyFile(...)函数后,直接访问文件./to.txt中的内容会发生什么呢?

这将不会读到复制过来的内容,就行这样:

copyFile('./from.txt','./to.txt')
fs.readFile('./to.txt',(err,data)=>{
    ...
})

如果在执行程序之前,./to.txt文件还没有创建,将得到如下错误:

PS E:CodeNodedemos

Das obige ist der detaillierte Inhalt vonDie Grundkonzepte von Asynchronität und Rückruf in JavaScript und das Phänomen der Rückrufhölle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen