.then(functionReference)和.then(function(value){return functionReference(value)})之间是否存在差异?

gue*_*314 11 javascript promise

给定用于处理Promise值的命名函数

function handlePromise(data) {
  // do stuff with `data`
  return data
}
Run Code Online (Sandbox Code Playgroud)

a)传递命名函数handlePromise作为参考.then()

promise.then(handlePromise)
Run Code Online (Sandbox Code Playgroud)

b)使用匿名或命名函数作为参数.then()并返回指定函数,handlePromise并将Promise值作为参数传递给传递给匿名或命名函数的主体.then()

promise.then(function /*[functionName]*/(data) {return handlePromise(data)})
Run Code Online (Sandbox Code Playgroud)

问题

  1. 模式a)和b)之间是否存在差异?

  2. 如果对1.的答案是肯定的,那么在使用任何一种模式时应该考虑哪些差异?

Ben*_*aum 5

可以创建一个在没有参数传递时存在差异的情况,但它是一个拉伸,通常你应该传递f而不是function(x) { return f(x); }或x => f(x)因为它更干净.

这是一个导致差异的示例,基本原理是带参数的函数可能会导致这些参数产生副作用:

function f() {
   if(arguments.length === 0) console.log("win");
   else console.log("Hello World");
}
const delay = ms => new Promise(r => setTimeout(r, ms)); // just a delay
delay(500).then(f); // logs "Hello World";
delay(500).then(() => f()) // logs "win"
Run Code Online (Sandbox Code Playgroud)

  • 我在这里看不到哪里有副作用?我能发现的唯一区别是`()=> f()`与`x => f(x)`不同(这不是问题所在) (4认同)