4

コードは IPFS (Inter-planetary file-system) 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()関数は 3 つの引数を取ります – オブジェクトがなく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

エクスポートされるもの全体がfunctionsendであり、引数として期待されます。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
});

(多くの場合、上記の最初の 2 つのステートメントは 1 つのステートメントとして記述されます。たとえば、let add = require("add")(senderFunction);)

send基本的に、全体は、ビルダーを呼び出すことによって注入される、特定の関数を使用する何かのための 1 つの大きなビルダーです。このようにして、 のテスト バージョンを注入することでテストできsend、実際のバージョンの を注入することで実際に使用できsendます。および/または のさまざまな「実際の」バージョンをさまざまなsend環境、トランスポート メカニズムなどで使用できます。

于 2016-05-27T15:47:23.847 に答える