2017-09-09 1 views
0

J'ai le code suivant illustre mon problème.Comment changer l'ordre de 'ceci' en le passant par bind en JavaScript?

var p = Promise.resolve('this-is-the-title'); 
createFilePath=(title, ex)=>{ 
    let ready = `${title.split(' ').join('-')}.${ex}` 
    console.log(ready) 
    return Promise.resolve(ready) 
} 
makeFile=(path,content)=>{ 
    return{ 
    file: path, 
    content 
    } 
} 
p 
    .then(createFilePath.bind(this,'md')) 

Ce qui sera enregistré est md.this-is-the-title. Est-il possible de changer l'ordre de this (quelque chose comme .then(createFilePath.bind('md', this)))

createFilePath est utilisé par d'autres fonctions, donc je ne voudrais pas passer par le code et changer createFilePath(ex,title).

Répondre

3

Actuellement, votre utilisation de bind équivaut à ceci:

p.then(function(promiseValue) { 
    return createFilePath.call(this, 'md', promiseValue) 
}) 

Ici, le promiseValue est la valeur de la promesse p, qui est 'this-is-the-title' dans votre exemple. bind est utilisé pour 'appliquer partiellement' les arguments de la fonction createFilePath mais vous ne pouvez le faire que de gauche à droite, vous ne pouvez pas ignorer le premier argument et simplement spécifier le deuxième argument. Vous pouvez le faire vous-même en utilisant une fonction d'emballage:

p.then(function(promiseValue) { 
    return createFilePath.call(this, promiseValue, 'md') 
}) 

Si vous n'avez pas besoin de la valeur this à l'intérieur createFilePath (que vous ne le faites pas dans votre exemple mais vous pouvez dans votre code réel), vous pouvez simplifier plus loin:

p.then(function(promiseValue) { 
    return createFilePath(promiseValue, 'md') 
}) 
+0

Je pensais qu'il y avait un moyen de le faire sans la fonction anonyme supplémentaire – relidon