javascript未来的函数:生成器和promise

1.通过生成器让函数持续执行。

2.使用promise处理异步任务。

3.使用生成器和promise书写优雅代码。

ES6语言特性:生成器(generator)和promise(promise)

生成器(generator)是一种特殊类型的函数。当从头到尾运行标准函数时,它最多只生成一个值。然而生成器函数会在几次运行请求中暂停,因此每次运行都可能会生成一个值。虽然生成器对JavaScript来说是一个新特性,其实它已经在Python、PHP和C#中存在很长时间了。

如何使用生成器?如何使用生成器来简化复杂循环,如何利用生成器的能力来挂起和恢复循环的执行,这些技巧都能帮助你写出更简单、更优雅的异步代码。

对象的一个新的内置类型promise,也能帮你编写异步代码。promise对象是一个占位符,暂时替代那些尚未计算出来但未来会计算出的值。对于多个异步操作来说,使用promise对象是非常有好处的。

你知道吗?

1.生成器函数的主要用途是什么?

2.在异步代码中,为什么使用promise比使用简单的回调函数更好?

3.使用Promise.race来执行很多长期执行的任务,promise最终会在上面时候变成resolved状态?它什么时候会无法变成resolved状态?

使用生成器和promise编写优雅的异步代码

扫描二维码关注公众号,回复: 4715426 查看本文章

由于JavaScript依赖于单线程执行模型,如果需要从服务器获取数据是一个长时间操作,所以会出现在耗时操作结束之前,UI渲染会暂停,最终造成应用无响应。。当然可以使用回调解决上述问题,但是这样代码会很散乱,其中包括很多错误处理的样板代码。我们可以使用生成器函数和promise大显身手了。

console.log("--------------------使用生成器和promise编写优雅的异步代码-------------");

async(function* () {

try{

//通过在function关键字后藏家一个*号码可以定义生成器函数。在生成器函数中可以使用新的yield关键字

//promises对象都隐含在了getJSON方法中,所以比起非阻塞回调函数代码,使用生成器和promise明显更为优雅。

const ninjas = yield getJSON('ninjas.json');

const missions = yield getJSON(ninjas[0].missionsUrl);

const missionDescription = yield getJSON(missions[0].detailsUrl);

} catch (e) {

 

}

});

生成器函数几乎是一个完全崭新的函数类型,他和标准的普通函数完全不同。生成器(generator)函数能生成一组值的序列,但每个值的生成是基于每次请求,并不同于标准函数那样立即生成。我们必须显示地向生成器请求一个新的值,随后生成器要么响应一个新生成的值,要么就告诉我们它之后不会再生成新值。每当生成器函数生成了一个值,它都不会像普通函数一样停止执行。相反,生成器几乎不挂起。随后,当对另一个值的请求到来后,生成器就会从上次离开的位置恢复执行。

 

console.log("------------使用生成器函数生成一些列值--------------------");
//通过在关键字function后面添加星号*,定义生成器函数
function* WeaponGenerator() {
  //使用新的关键字yield生成独立的值
  yield "Katana";
  yield "Wakizashi";
  yield "Kusarigama";
}
//使用新的循环类型for-of取出生成的值序列
for (let weapon of WeaponGenerator()) {
  if (weapon !== undefined) {
    console.log("weapon:" + weapon);
  }
}

 

首先定义了一个生成器,它能够生产一些列weapon的数据,创建一个生成器函数非常简单:仅仅需要在关键字function后面加上一个星号(*)。这样一来生成器函数体内就能够使用新关键字yield,从而生成独立的值。

 

 

创建了一个叫做WeaponGenerator的生成器,其用于生成一系列weapon数据:Katana、Wakizashi和Kusarigama。作为取出weapon数据序列值的方法之一,

for-of是一种用于循环结构新类型:

//使用新的循环类型for-of取出生成的值序列

for (let weapon of WeaponGenerator()) {

if (weapon !== undefined) {

console.log("weapon:" + weapon);

}

}

 

我们把执行生成器得到的结果放在for-of循环的右边。如果观察WeaponGenerator函数的函数体,发现没有return语句。这是为什么?这个例子中,for-of循环的右边不是应该得到undefined,就像我们处理一个标准函数一样吗?真相是生成器函数和标准函数非常不同。对于初学者来说,调用生成器并不会执行生成器函数,相反,它会创建一个叫迭代器(iterator)的对象。

 

参考《JavaScript忍者秘籍》

猜你喜欢

转载自blog.csdn.net/zhangying1994/article/details/85390489