- 此处 function1 后面多了一个数字 1
(async function1 main() {
https://github.com/wangdoc/es6-tutorial/blame/master/docs/async.md#L755
- 此处 unusued 字母 e 前面多了一个字母 u
var unusued = 'I have no purpose!';
https://github.com/wangdoc/es6-tutorial/blame/master/docs/style.md#L500
- 此处的输出应为 0 1 2,而不是 1 2 3
it.next().value.then(o => console.log(o)) // 1
it.next().value.then(o => console.log(o)) // 2
it.next().value.then(o => console.log(o)) // 3
https://github.com/wangdoc/es6-tutorial/blame/master/docs/async-iterator.md#L66
- 以下两处的示例代码应该包在一个 async 函数里
const asyncIterable = createAsyncIterable(['a', 'b']);
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
const [{value: v1}, {value: v2}] = await Promise.all([
asyncIterator.next(), asyncIterator.next()
]);
console.log(v1, v2); // a b
https://github.com/wangdoc/es6-tutorial/blame/master/docs/async-iterator.md#L135
const writer = openFile('someFile.txt');
writer.next('hello'); // 立即执行
writer.next('world'); // 立即执行
await writer.return(); // 等待写入结束
https://github.com/wangdoc/es6-tutorial/blame/master/docs/async-iterator.md#L425
- 以下两处的 SharedBuffer 确切地应该改为 SharedArrayBuffer,另外变量
sharedArray[index]
的名称没有和下面 Atomics.load
和 Atomics.store
里的 array
对应上,建议把下面的 array
改为 sharedArray
,下文也大量使用了 sharedArray
变量名做演示
Atomics.load(array, index)
Atomics.store(array, index, value)
store
方法接受三个参数:SharedBuffer 的视图、位置索引和值,返回sharedArray[index]
的值。load
方法只接受两个参数:SharedBuffer 的视图和位置索引,也是返回sharedArray[index]
的值。
- 此处的 移出模块 和 模块内部 的 模块 应该是指 类,移除类 和 模块内部,下方的演示代码整体指 模块,“所有方法都是对外可见的“指的是此模块会导出此 类 吧。
另一种方法就是索性将私有方法移出模块,因为模块内部的所有方法都是对外可见的。
class Widget {
foo (baz) {
bar.call(this, baz);
}
// ...
}
function bar(baz) {
return this.snaf = baz;
}
上面代码中,foo
是公开方法,内部调用了bar.call(this, baz)
。这使得bar
实际上成为了当前模块的私有方法。
https://github.com/wangdoc/es6-tutorial/blame/master/docs/class.md#L740
- 下方的 “同一个
my_module
实例,应为同一个my_module
模块吧
上面代码中,虽然foo
和bar
在两个语句中加载,但是它们对应的是同一个my_module
实例。也就是说,import
语句是 Singleton 模式。
https://github.com/wangdoc/es6-tutorial/blame/master/docs/module.md#L289
- 以下几段示例代码的变量名 Thunk 建议改个名,如 toThunk,理由是 Thunk 函数实际指的是使用 Thunk 转换后的函数,直接使用 Thunk 容易让人以为它才是 Thunk 函数。就如后文介绍的 thunkify,字面意思就代表它是一个转换函数,转换后的函数是 Thunk 函数。
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。
// 正常版本的readFile(多参数版本)
fs.readFile(fileName, callback);
// Thunk版本的readFile(单参数版本)
var Thunk = function (fileName) {
return function (callback) {
return fs.readFile(fileName, callback);
};
};
var readFileThunk = Thunk(fileName);
readFileThunk(callback);
上面代码中,fs
模块的readFile
方法是一个多参数函数,两个参数分别为文件名和回调函数。经过转换器处理,它变成了一个单参数函数,只接受回调函数作为参数。这个单参数版本,就叫做 Thunk 函数。
任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。下面是一个简单的 Thunk 函数转换器。
// ES5版本
var Thunk = function(fn){
return function (){
var args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
// ES6版本
const Thunk = function(fn) {
return function (...args) {
return function (callback) {
return fn.call(this, ...args, callback);
}
};
};
使用上面的转换器,生成fs.readFile
的 Thunk 函数。
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);
下面是另一个完整的例子。
function f(a, cb) {
cb(a);
}
const ft = Thunk(f);
ft(1)(console.log) // 1
https://github.com/wangdoc/es6-tutorial/blame/master/docs/generator-async.md#L287
- 以下的 “一旦遇到
await
就会先返回”,这里的 返回 改成 暂停 更准确,或者改成 “一旦遇到await
就会先等到其后异步操作完成,再接着执行函数体内后面的语句。”
async
函数返回一个 Promise 对象,可以使用then
方法添加回调函数。当函数执行的时候,一旦遇到await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
https://github.com/wangdoc/es6-tutorial/blame/master/docs/async.md#L72
- 最后一点小建议
整书里有好几处作为知识点后的演示案例,使用 实例 来代表示例,建议改用 示例 或 应用案例 等来表述,以免和书中大量出现的 实例对象 的实例混淆。这个主要出现在章节的标题,另外其他一些地方也偶有出现。另外,JavaScript 教程 那本书中也出现了几处。