Node.js Generators & 与回调比较
在本教程中,我们将学习 Generator以及它们与回调的区别
什么是生成器?
Generator已经变得相当出名 Node.js 这可能是因为他们有能力做到这一点。
- Generator是可以暂停并在稍后恢复的功能执行。
- Generator在执行诸如“惰性执行”之类的概念时很有用。这基本上意味着通过暂停执行并随意恢复,我们能够仅在需要时提取值。
Generator有以下2种主要方法。
- 产量法 – 在函数中调用yield方法,在调用yield方法的特定行停止函数的执行。
- 下一个方法 – 此方法由主应用程序调用,用于恢复具有yield方法的函数的执行。该函数的执行将持续到下一个yield方法或直到该方法结束。
让我们看一个如何使用生成器的例子。
在我们的示例中,我们将有一个简单的 Add 函数,它将添加 2 个数字,但我们将继续在不同点暂停方法执行,以展示如何使用生成器。
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return x + y; } var gen = Add(5); gen.next(); gen.next();
代码说明
- 第一步是定义我们的生成器“函数”。请注意,这是通过在 function 关键字中添加“*”来完成的。然后我们定义一个名为 Add 的函数,它接受一个参数 x。
- Yield 关键字是生成器特有的。这使它成为在任何事情中间暂停函数的强大构造。因此,在这里,函数执行将暂停,直到我们调用 next() 函数,这将在步骤 4 中完成。此时,x 的值将变为 6,并且函数的执行将停止。
- 这是我们首先调用生成器函数并将值 5 发送给我们的 Add 函数的地方。该值将替换为 Add 函数的 x 参数。
- 一旦我们调用 next() 函数,Add() 函数将恢复执行。当执行下一个语句 var y=yield(null) 时,Add() 函数将再次停止执行。
- 现在再次调用 next() 函数后,将运行下一个语句,并将 x=5 和 y=6 的组合值相加并返回。
回调与生成器
Generator用于解决所谓的回调地狱问题。有时,在 Node.js 应用程序开发过程中,回调函数会变得嵌套过多,以至于使用回调函数变得过于复杂。
这时生成器就派上用场了。最常见的例子之一是创建计时器函数。
让我们看下面的例子来了解生成器如何比回调更有用。
我们的示例将创建一个简单的时间延迟函数。然后,我们将调用此函数并结合 1000、2000 和 3000 毫秒的延迟。
步骤1) 使用必要的时间延迟代码定义我们的回调函数。
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
代码说明
- 这里我们创建了一个名为 Timedelay 的函数,它有一个名为 ptime 的参数。这将接收我们想要在应用程序中引入的必要时间延迟。
- 下一步就是创建一条消息,该消息将显示给用户,告知应用程序将暂停若干毫秒。
步骤2) 现在让我们看看如果我们要合并回调函数的代码。假设我们想要合并基于 1000、2000 和 3000 毫秒值的回调函数,下面的代码显示了我们需要如何使用回调函数来实现这些回调函数。
Timedelay(1000, function(message) { console.log(msg); Timedelay(2000, function(message) { console.log(msg); Timedelay(3000, function(message) { console.log(msg); }) }) })
代码说明
- 我们将 Timedelay 作为回调来调用,其值为 1000。
- 接下来我们要再次调用 Timedelay 函数,并以 2000 作为值。
- 最后,我们要再次调用 Timedelay 函数,并以 3000 作为值。
从上面的代码中,你可以看到,由于我们想要多次调用该函数,它变得更加混乱。
步骤3) 现在让我们看看如何使用生成器实现相同的代码。从下面的代码中你现在可以看到使用生成器实现 Timedelay 函数变得多么简单。
function* Messages() { console,log(yield(Timedelay(1000, function(){}))); console,log(yield(Timedelay(2000, function(){}))); console,log(yield(Timedelay(3000, function(){}))); }
代码说明
- 我们首先定义一个生成器函数,它将用于调用我们的 Timedelay 函数。
- 我们正在调用 Yield 函数以及 Timedelay 函数,并以 1000 作为参数值。
- 然后我们调用 Yield 函数以及 Timedelay 函数,并以 2000 作为参数值。
- 最后,我们调用 Yield 函数以及 Timedelay 函数,并以 3000 作为参数值。
结语
Generators 还可用于缓解嵌套回调的问题,并有助于消除所谓的回调地狱。 Generator用于暂停函数的处理。这是通过在异步函数中使用“yield”方法来实现的。