Javascript 函数混淆语法

Javascript function confused syntax

我对下面的代码有点困惑。很明显是用es6代码写的一个双箭头函数,但是有些部分我不明白。

  1. 第二个参数done是一个什么都不做的空函数?或者它是用一个简单的 return 作为第二个箭头匿名函数的结果执行的?

  2. XXXX.load 是 returns 一些结果的承诺函数。 Index 的调用者如何获得第二个参数 done 的结果,即 done(null, result) ?

  3. es5中的等效代码是什么?

const Index = (name, done = () => {}) => (dispatch, getState) => {
  
  return XXXX.load()
    .then((result) => {
      dispatch({type:OK});
      done(null, result);
    })
    .catch((error) => {
      dispatch({type:ERROR});
      done(error);
    });
};

The 2nd parameter named done is an empty function that does nothing?

这是一个参数。它接受你赋予它的任何价值。

如果调用者未传递第二个参数,则分配的 default 值是一个不执行任何操作的函数。这样就可以在不抛出 undefined is not a function 错误或进行显式测试以查看它是否为函数的情况下调用它。

How the caller of the Index can get the results of the 2nd parameter done ie done(null, result) ?

通过将它自己的函数作为第二个参数传递。

What is the equivalent code in es5?

var Index = function(name, done) {
    if (!done) done = function() {};

    return function(dispatch, getState) {

        return XXXX.load()
            .then(function(result) {
                dispatch({
                    type: OK
                });
                done(null, result);
            })
            .catch(function(error) {
                dispatch({
                    type: ERROR
                });
                done(error);
            });

    }
};

让我们一一道来:

  1. Index (name, done = () => {}) 定义了 done 的默认值,以防在调用 Index 时提供 none。这有助于在 done 为 null/undefined 的情况下不做任何检查。你也可以这样写
const Index = (name, done) => (dispatch, getState) => {
  if (!done) {
   done = () => {}
  }
 }
  1. 调用Index时,caller只会传递一个函数作为第二个参数。

一般说明:Index 实际上 returns 一个需要 dispatch and/or 一个 getState 参数的函数。

  1. 空函数是 done 的默认值。默认值可防止 运行 时间崩溃。

2 和 3 可以通过查看以下代码来理解:(只需 运行 它并查看控制台。

const DEFAULT_FUNCTION_VALUE = ()=> {};

const XXXX = {
  load: function() {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
         resolve({data: 'from XXXX.load'});
      },2000);
    });
  }
}

const Index = function(name='', done=DEFAULT_FUNCTION_VALUE) {
  return function(dispatch, getState) {
    return XXXX.load().then(function(result) {
      console.log({result});
      done(result);
    }).catch(function(error) {
        console.log(error);
    });
  }
}

function doneImplementation(data) {
  console.log('Data from done- ', data);
}

Index('', doneImplementation)();