引自http://es6.ruanyifeng.com/#docs/generator#yield--表达式

1.常用的回调方法

step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});

2.ES6中的Promise

Promise.resolve(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.done();

3.Generator同步的方法

function* longRunningTask(value1) {
try {
var value2 = yield step1(value1);
var value3 = yield step2(value2);
var value4 = yield step3(value3);
var value5 = yield step4(value4);
// Do something with value4
} catch (e) {
// Handle any error from step1 through step4
} scheduler(longRunningTask(initialValue)); function scheduler(task) {
var taskObj = task.next(task.value);
// 如果Generator函数未结束,就继续调用
if (!taskObj.done) {
task.value = taskObj.value
scheduler(task);
}
}

另一种方法

let steps = [step1Func, step2Func, step3Func];

function *iterateSteps(steps){
for (var i=; i< steps.length; i++){
var step = steps[i];
yield step();
}
}

4.Generator异步

function run(fn) {
var gen = fn(); function next(err, data) {
var result = gen.next(data);
if (result.done) return;
result.value(next);
} next();
}
var g = function* (){
var f1 = yield readFile('fileA');
var f2 = yield readFile('fileB');
// ...
var fn = yield readFile('fileN');
}; run(g);
 

5.async

var asyncReadFile = async function () {
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};

async函数对 Generator 函数的改进,体现在以下四点。

(1)内置执行器。

Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行。

var result = asyncReadFile();

上面的代码调用了asyncReadFile函数,然后它就会自动执行,输出最后结果。这完全不像 Generator 函数,需要调用next方法,或者用co模块,才能真正执行,得到最后结果。

(2)更好的语义。

asyncawait,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。

(3)更广的适用性。

co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。

(4)返回值是 Promise。

async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

进一步说,async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

demo:

我们通过一个例子,来看 async 函数与 Promise、Generator 函数的比较。

假定某个 DOM 元素上面,部署了一系列的动画,前一个动画结束,才能开始后一个。如果当中有一个动画出错,就不再往下执行,返回上一个成功执行的动画的返回值。

首先是 Promise 的写法。

function chainAnimationsPromise(elem, animations) {

  // 变量ret用来保存上一个动画的返回值
var ret = null; // 新建一个空的Promise
var p = Promise.resolve(); // 使用then方法,添加所有动画
for(var anim of animations) {
p = p.then(function(val) {
ret = val;
return anim(elem);
});
} // 返回一个部署了错误捕捉机制的Promise
return p.catch(function(e) {
/* 忽略错误,继续执行 */
}).then(function() {
return ret;
}); }

接着是 Generator 函数的写法。

function chainAnimationsGenerator(elem, animations) {

  return spawn(function*() {
var ret = null;
try {
for(var anim of animations) {
ret = yield anim(elem);
}
} catch(e) {
/* 忽略错误,继续执行 */
}
return ret;
}); }

最后是 async 函数的写法。

async function chainAnimationsAsync(elem, animations) {
var ret = null;
try {
for(var anim of animations) {
ret = await anim(elem);
}
} catch(e) {
/* 忽略错误,继续执行 */
}
return ret;
}

最新文章

  1. 多线程条件通行工具——CountDownLatch
  2. ionic路由传值
  3. Leetcode 168 Excel Sheet Column Title 进制数转化
  4. Warning:mailcious javascript detected on this domain来由
  5. C#算法基础之插入排序
  6. PhantomJS实现最简单的模拟登录方案
  7. Raphael的鼠标over move out事件
  8. 不免费的PacMan
  9. Java求素数时出现错误
  10. 与scrollTop相关的一些方法(更新)
  11. Luogu4197 Peaks
  12. linux服务器上简单命令
  13. CRM 2016 及 CRM 365 更新地址
  14. SQL SERVER2008判断文件夹是否存在并创建文件夹
  15. Rime输入法的配色方案
  16. 18_使用react脚手架构建应用
  17. POJ 1625 Censored!(AC自动机+高精度+dp)
  18. zabbix 监控windows端cpu使用率百分比
  19. DateFormat工具类
  20. jquery 根据name获取元素的问题

热门文章

  1. ForkJoin学习笔记
  2. iOS开发JSON字符串和字典互转
  3. ubuntu install redis/mongo 以及 监控安装
  4. Spring事物管理机制简单学习
  5. 《DSP using MATLAB》Problem 8.33
  6. 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件
  7. 试做Chrome插件——whatweb的chrome插件(从老博客转)
  8. jQuery插件编写,
  9. 学习 debug
  10. Python遇到的第一个问题