Promise 陷阱
避免常见错误
Promise 并不像其他值那样工作
你不能像对待普通值那样直接打印它们的值:
// 这在 Promise 上没有意义:console.log(Promise.resolve(42));
// 必须使用 `.then` 接口:Promise.resolve(42).then(value => console.log(value));Promise 不会在你犯错时提醒你
好吧,这是一种常见的错误。
出于各种原因,TC39 决定 .then 和 .catch 可以接受 null。例如,.then(null, null) 是合法的,所需行为是跳过链中的那一步。
这带来的不幸后果是:很容易把事情弄错。
示例说明
来看一个小挑战:以下哪个选项会 console.log 出 42?
// 选项 #1:Promise.resolve(42).then(console.log());
// 选项 #2:Promise.resolve(42).then(console.log);
// 选项 #3:Promise.resolve(42).then(value => console.log(value));
// 选项 #4:Promise.resolve(42) .then(console.log()) .then(console.log);答案
答案是 #2、#3 和 #4。
为什么?我们来看传给 .then() 的 类型:
var arg1 = console.log();var arg2 = console.log;var arg3 = value => console.log(value);
typeof arg1 === "undefined";typeof arg2 === "function";typeof arg3 === "function";仍然想知道第 4 个选项是怎么工作的?
它实际上是这样运行的:
// 选项 #4 - 实际效果Promise.resolve(42) .then(undefined) // 这对值没有影响,会把值传给后面的 `.then(fn)` .then(console.log);