承诺链中的.then(console.log())和.then(()=> console.log())在执行方面有何不同

时间:2018-06-13 11:35:57

标签: javascript es6-promise

效率有什么不同吗? 如果使用setTimeout而不是console.log()

,行为是否会有所不同

1 个答案:

答案 0 :(得分:4)

你基本上可以做这三件事

.then(console.log())

这会立即调用console.log,而不会等到promise被解决,所以这可能不是你想要做的事情。

.then(console.log)

只有在promise成功解析后才需要执行console.log(需要一个函数调用),并将promise的结果隐式传递给console.log函数。

.then(() => console.log())

与之前相同,需要2个函数调用,但您可以轻松地将一些其他参数传递给它。

要在第二种情况下将附加参数传递给console.log,您需要使用Function.prototype.bind方法。

const promise = new Promise((resolve, reject) => {
  resolve('');
});
promise.then(console.log.bind(console, 'new arg'));

并且看到上面提到的所有三个案例

const promise1 = new Promise((resolve, reject) => {
  resolve('promise 1');
});
promise1.then(console.log());

const promise2 = new Promise((resolve, reject) => {
  resolve('promise 2');
});
promise2.then(console.log);

const promise3 = new Promise((resolve, reject) => {
  resolve('promise 3');
});
promise3.then(v => console.log(v));

在第一种情况下,console.log没有收到和参数。在第二种情况下,console.log隐式地从promise接收值,在第三种情况下,它显式地接收相同的值。

在这种情况下,第二种情况和第三种情况之间唯一的性能差异是第三种情况再执行一次函数调用(这是我们不必担心的事情)。