这篇文章的内容非常适合Javascript初学者。将以简单易懂的语言进行描述,您不用担心看不懂。
Promise是学习现代Javascript语言不可缺少的知识点。很多人读的时候都感到很困惑。主要原因可以用一句话概括:
代码不再从上到下执行。
一般情况下,我们写的代码都是顺序执行的,比如我们写一段从1数到3的代码。
console.log(1) console.log(2) console.log(3)
按F12打开我们浏览器的控制台,将上面的代码复制进去,回车,可以看到数字1到3按顺序打印出来了。
1 2 3
现在,如果我们有一个要求,代码的顺序不能改变,但最终打印输出的顺序必须与代码的顺序无关,可以这样做吗?
我们想象一下,如果1、2、3分别由三个人打印,那么就非常简单了。我们只需要告诉他们同时打印数字的任务即可,打印输出的顺序只与任务的执行时间有关。
那么,我们如何将打印任务分配给三个人呢?这就是使用Promise的地方。通过创建一个新的 Promise 对象,我们可以将一段代码分配给一个新的“进程”,而不是在当前的“进程”上执行。注意,这里的“进程”和我们常说的操作系统进程并不一样,而只是一个抽象概念,代表一个按顺序执行代码的虚拟单元。
刚才我们说了,Promise它可以看作是一个新的“进程”,所以如果我们想让它执行任何代码,我们可以将它包装在一个函数中交给它。这样代码就不会立即执行。
Promise还为我们提供了两个函数,一个是resolve,一个是reject,我们可以分别在任务完成和失败时调用。这两个函数作为参数传递给Promise的内部。所以,我们可以这样组装:
Promise( (resolve, _reject) => { setTimeout(() => { console.log(1) resolve() }, 300) } )
这里我们使用setTimeout来模拟一个耗时的任务。在实际场景中,此任务可能是读取文件、请求网络接口或等待用户输入。当任务完成后,我们调用resolve函数来表示任务已经完成。
然后,我们按照同样的方法,Promise在组装另外两个的时候,只需要向他们提供不同的打印数量和任务所需的时间即可。最后,完整的代码是这样的,你可以尝试复制到控制台试试。
Promise( (resolve, _reject) => { setTimeout(() => { console.log(1) resolve() }, 300) } ) new Promise( (resolve, _reject) => { setTimeout(() => { console.log(2) resolve() }, 200) } ) new Promise( (resolve, _reject) => { setTimeout(() => { console.log(3) resolve() }, 100) } )
最后,数字打印的顺序与任务的执行时间有关:
3 2 1
并发编程是关于如何在有限数量的CPU核心上模拟大量任务同时执行。 Javascript中的Promise提供了一种方便快捷的并发编程方式,以及一套处理返回值和错误值的规范。了解并熟悉这个规范后,我们可以大大提高处理并发任务的效率。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3