2017-10-18 24 views
1

Je lis un livre sur les modèles de conception de noeud, c'est un code de la page 99 here:partiellement l'application à l'aide mkdirp Function.prototype.bind()

function download(url, filename, callback) { 
    console.log(`Downloading ${url}`); 
    let body; 

    async.series([ 
    callback => {         //[1] 
     request(url, (err, response, resBody) => { 
     if(err) { 
      return callback(err); 
     } 
     body = resBody; 
     callback(); 
     }); 
    }, 

    mkdirp.bind(null, path.dirname(filename)),  //[2] 

    callback => {         //[3] 
     fs.writeFile(filename, body, callback); 
    } 
    ], err => {          //[4] 
    if(err) { 
     return callback(err); 
    } 
    console.log(`Downloaded and saved: ${url}`); 
    callback(null, body); 
    }); 
} 

Je ne vous suis pas ce qui se passe à //[2]. Le livre dit que vous appliquez partiellement la fonction avec bind. D'après ma compréhension de mdn here, lorsque vous utilisez bind vous n'appelez pas la fonction.

Comment ce code fonctionne-t-il si vous n'appelez pas mkdirp() plus tard? S'agit-il de l'argument callback dans fs.writeFile?

J'ai une solution potentielle à cela. Vous donnez async.series la liste des fonctions qu'il va exécuter et exécuter. Le mozilla mdn dit que bind renvoie une fonction prête à être exécutée. Si vous utilisez call ou apply vous obtenez le résultat de la fonction. async.series veut qu'une fonction soit exécutée, donc vous utilisez bind pour l'avoir assis là sans qu'il ne soit en cours d'exécution.

Répondre

1

Vous avez mal interprété le code. mkdirp.bind(... n'est appelée nulle part dans le code, mais dans l'appel async.series, et plus précisément dans sa déclaration de paramètres (le tableau []). async.series prend comme argument un tableau contenant des références de fonction et les appellera dans l'ordre, l'un après l'autre.

  1. //[1] est appelé,
  2. Alors //[2] est appelé qui est la référence à mkdirp déjà lié avec le paramètre (vous pouvez voir un exemple here)
  3. Et ainsi de suite ...

Pour vous éclaircir, le code aurait pu être écrit de la façon suivante:

function download(url, filename, callback) { 
    console.log(`Downloading ${url}`); 
    let body, 
    getFile = callback => { 
     request(url, (err, response, resBody) => { 
     if (err) { 
      return callback(err); 
     } 
     body = resBody; 
     callback(); 
     }); 
    }, 
    boundMkdirp = mkdirp.bind(null, path.dirname(filename)), 
    writeFile = callback => { 
     fs.writeFile(filename, body, callback); 
    }; 

    async.series([ 
    getFile, 
    boundMkdirp, 
    writeFile 
    ], err => { 
    if (err) { 
     return callback(err); 
    } 
    console.log(`Downloaded and saved: ${url}`); 
    callback(null, body); 
    }); 
}