let after = function (times, callback) { let result = {}; returnfunction (key, value) { result[key] = value; if (Object.keys(result).length == times) { callback(result); } }; }; let done = after(2, function (result) { console.log(result); });
let fs = require('fs'); functionreadFile(filename) { returnnewPromise(function (resolve, reject) { fs.readFile(filename, function (err, data) { if (err) reject(err); elseresolve(data); }); }); } function* read() { let template = yieldreadFile('./template.txt'); let data = yieldreadFile('./data.txt'); return template + '+' + data; } co(read).then( function (data) { console.log(data); }, function (err) { console.log(err); } );
1 2 3 4 5 6 7 8 9 10 11 12 13
functionco(gen) { let it = gen(); returnnewPromise(function (resolve, reject) { !(functionnext(lastVal) { let { value, done } = it.next(lastVal); if (done) { resolve(value); } else { value.then(next, (reason) =>reject(reason)); } })(); }); }
6.5 Async/ await
使用async关键字,你可以轻松地达成之前使用生成器和 co 函数所做到的工作
6.5.1 Async 的优点
内置执行器
更好的语义
更广的适用性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
let fs = require('fs'); functionreadFile(filename) { returnnewPromise(function (resolve, reject) { fs.readFile(filename, 'utf8', function (err, data) { if (err) reject(err); elseresolve(data); }); }); }
asyncfunctionread() { let template = awaitreadFile('./template.txt'); let data = awaitreadFile('./data.txt'); return template + '+' + data; } let result = read(); result.then((data) =>console.log(data));
6.5.2 async 函数的实现
async 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
asyncfunctionread() { let template = awaitreadFile('./template.txt'); let data = awaitreadFile('./data.txt'); return template + '+' + data; }
// 等同于 functionread() { returnco(function* () { let template = yieldreadFile('./template.txt'); let data = yieldreadFile('./data.txt'); return template + '+' + data; }); }