Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解释一系列箭头运算符_Javascript_Express_Ecmascript 6 - Fatal编程技术网

Javascript 解释一系列箭头运算符

Javascript 解释一系列箭头运算符,javascript,express,ecmascript-6,Javascript,Express,Ecmascript 6,我有一个包含以下代码的文件: const logger = (options) => (req, res, next) => { if (typeof options === 'object' && options !== null && options.enable) { console.log( 'Status Code:', res.statusCode, 'UR

我有一个包含以下代码的文件:

const logger = (options) => (req, res, next) => {
  if (typeof options === 'object'
      && options !== null
      && options.enable) {
        console.log(
          'Status Code:', res.statusCode,
          'URL:', req.originalUrl,
        )
  }
  next()
}

module.exports = logger
它在不同的.js文件中使用:

const express = require('express')
const loggerMiddleware = require('./middleware-logger')
const app = express()

app.use(loggerMiddleware({
        enable: true,
}))

app.listen(
    1337,
    () => console.log('Web Server listening on 1337'),
)
有人能解释一下第一行中的=>系列发生了什么吗?我理解一个普通的req,res,next=>{}的意思如下:

有一个未命名的函数,它有3个参数,由大括号中的内容定义

在本例中,对于一系列箭头运算符,我不知道函数def如何同时查看options和req、res中的所有参数


引擎盖下到底发生了什么?这与承诺有关吗?同样,one方法def如何能同时看到所有参数?

您显示的代码是以下内容的简写:

const logger = function(options) {
  return function(req, res, next) {
    if (typeof options === 'object' &&
      options !== null &&
      options.enable) {
      console.log(
        'Status Code:', res.statusCode,
        'URL:', req.originalUrl,
      )
    }
    next()
  }
}
如果调用loggermdleware{enable:true,},它将返回一个新函数functionreq,res,next{…},该函数在options参数上创建一个闭包

这允许此返回函数在这种情况下,中间件可以在每个请求上访问传递的选项对象,而无需污染全局范围

到目前为止,还允许创建两个具有不同选项的中间件:

app.get('/with-logging', loggerMiddleware({
  enable: true,
}), function(res, res) {})


app.get('/without-logging', loggerMiddleware({
  enable: false,
}), function(res, res) {})

就个人而言,我认为那些选项=>req,res,next=>{构造不是真正可读的,它让我想起了那些奇特的嵌套三元条件运算符::cobination。

您显示的代码是以下内容的简写:

const logger = function(options) {
  return function(req, res, next) {
    if (typeof options === 'object' &&
      options !== null &&
      options.enable) {
      console.log(
        'Status Code:', res.statusCode,
        'URL:', req.originalUrl,
      )
    }
    next()
  }
}
如果调用loggermdleware{enable:true,},它将返回一个新函数functionreq,res,next{…},该函数在options参数上创建一个闭包

这允许此返回函数在这种情况下,中间件可以在每个请求上访问传递的选项对象,而无需污染全局范围

到目前为止,还允许创建两个具有不同选项的中间件:

app.get('/with-logging', loggerMiddleware({
  enable: true,
}), function(res, res) {})


app.get('/without-logging', loggerMiddleware({
  enable: false,
}), function(res, res) {})

我个人认为下一个选项是res=>{构造不是真正可读的,它让我想起了那些奇特的嵌套三元条件运算符?:协同作用。

简单的答案是,它是一个返回另一个函数的函数。有两个函数。第一个函数是logger的值,它有一个参数:选项。只要logger是cal,就会返回另一个函数led。它被称为currying。正如@charlietfl和其他评论中提到的功能。这是一个有人写的博客,特别是ES6中的currying。@Jacob这与currying非常相似。但如果你说currying,通常意味着修复一个或多个需要多个参数的函数参数。简单的答案是这是一个返回另一个函数的函数。有两个函数。第一个函数是logger的值,它接受一个参数:选项。另一个函数在调用logger时返回。它被称为currying。它被称为@charlietfl,注释中的其他函数都提到了该功能。这是有人写的博客特别是ES6中的currying。@Jacob它与currying非常相似。但是如果你说currying,通常是指修复一个函数的一个或多个需要多个参数的参数。好吧,嵌套的ternaries在超过两个表达式条件之后变得非常古怪。我经常使用ternaries,直到最近几天才使用currying f或者我的React组件中的handleClick.,是我唯一能想到的初始化属性的方法。@Jacob闭包和currying很棒。我想说的是functionoption{return req,res,next=>{}或functionoption{return functionreq,res,next{}在大多数情况下比options=>req,res,next=>{.Arrow函数经常被过度使用,仅仅是因为它们很花哨,代码也很短。我不能否认人们太过沉迷于最新的热点。它的进展总是首先让它工作!好吧,嵌套的ternaries在超过两个表达式条件之后变得非常古怪。我经常使用ternaries,直到最近我们才开始使用在我的React组件中,对handleClick进行ed Curring是我唯一能想到的初始化属性的方法。@Jacob闭包和Curring很棒。我想说的是functionoption{return req,res,next=>{}或functionoption{return functionreq,res,next{}大多数情况下比选项=>req,res,next=>{更容易阅读。箭头函数经常被过度使用,只是因为它们很花哨,代码也很短。我不能与人们太过沉迷于最新的热点争论。它的进展总是先让它工作!