4

代码来自 IPFS(星际文件系统)HTTP API JS 实现:https ://github.com/ipfs/js-ipfs-api/blob/master/src/api/add.js

'use strict'

const Wreck = require('wreck')

module.exports = (send) => {
    return function add(files, opts, cb) {
        if (typeof(opts) === 'function' && cb === undefined) {
            cb = opts
            opts = {}
        }
        if (typeof files === 'string' && files.startsWith('http')) {
            return Wreck.request('GET', files, null, (err, res) => {
                if (err) return cb(err)

                send('add', null, opts, res, cb)
            })
        }

        return send('add', null, opts, files, cb)
    }
}

所描述的add()函数是用于将数据推送到 IPFS 的函数。

我将首先解释我理解:该add()函数接受三个参数——如果没有options对象(用户省略它)并且它被一个函数替换:用户正试图实现一个回调函数——更改回调到opts; cb = opts.

其次,如果引用的文件是一个&&以 - 开头的文本文件,http它显然是远程托管的,我们需要使用Wreck.

这一切我都明白,但我们为什么要使用(send) =>箭头函数呢?我们为什么要使用return function add...send('add', null, opts, res, cb)return send('add', null, opts, res, cb)用于什么?回调 ( cb) 是如何实现的?帮助我了解这里发生了什么

4

1 回答 1

2

被导出的整个东西是一个函数,它期望send作为一个参数;这让调用代码通过传入send要使用的函数来进行依赖注入。期望使用这样的东西:

let addBuilder = require("add");
let add = addBuilder(senderFunction);
// This function ----^
// is `send` in the `add.js` file.
// It does the actual work of sending the command

// Then being used:
add(someFiles, someOptions, () => {
    // This is the add callback, which is `cb` in the `add.js` file
});

(通常,上面的前两个语句写成一个语句,例如let add = require("add")(senderFunction);

基本上,整个事情是一个使用给定send函数的大型构建器,通过调用构建器将其注入其中。这样,它可以通过注入 的测试版本进行测试send,并通过注入真实版本的send; 和/或各种“真实”版本send可以在不同的环境、传输机制等中使用。

于 2016-05-27T15:47:23.847 回答