2015-10-02 6 views
65

promessa, solo per esempioPromesse, passano parametri aggiuntivi per concatenare poi

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
    setTimeout(function(){ 
     resolve(a); 
    }, 3000); 
    } else { 
    reject(a); 
    } 
}); 

Dopo che noi chiamiamo allora metodo su promessa:

P.then(doWork('text')); 

funzione DoWork assomiglia a questo:

function doWork(data) { 
    return function(text) { 
    // sample function to console log 
    consoleToLog(data); 
    consoleToLog(b); 
    } 
} 

Come posso evitare la funzione interna in doWork, per ottenere l'accesso ai dati da parametri di promessa e testo? se ci sono trucchi? Grazie.

+1

Perché qualcuno dovrebbe rinunciare intenzionalmente ** al curriculum **? Per usare l'orribile metodo 'bind'? - che è anche estremamente lento. – ftor

+0

@ftor Non ti capisco, puoi fornire qualche codice per chiarimenti? – Roland

risposta

59

È possibile utilizzare Function.prototype.bind per creare una nuova funzione con un valore passato al primo argomento, come questo

P.then(doWork.bind(null, 'text')) 

ed è possibile modificare doWork a,

function doWork(text, data) { 
    consoleToLog(data); 
} 

Ora, text sarà in realtà 'text' in doWork e data sarà il valore risolto dalla Promessa.

Nota: Assicurarsi di collegare un gestore di rifiuto alla catena delle promesse.


programma di lavoro:Live copy on Babel's REPL

function doWork(text, data) { 
    console.log(text + data + text); 
} 

new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function() { 
     resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
    }) 
    .then(doWork.bind(null, 'text')) 
    .catch(console.error); 
+0

grazie, che aiuta, prima provavo doWork.call (questo, 'testo'), ma i dati sono stati sostituiti da 'testo' – user3110667

+1

'call' richiama una funzione sul posto,' bind' crea una nuova funzione, tuttavia entrambi accettano un contesto di esecuzione come primo argomento. – sdgluck

63

Forse la risposta più semplice è:

P.then(function(data) { return doWork('text', data); }); 

Oppure, dal momento che questo è etichettato ecmascript-6, tramite le funzioni di direzione:

P.then(data => doWork('text', data)); 

Trovo questo più leggibile e non troppo da scrivere.

+3

Grazie, quest'ultimo è semplicemente bello rispetto a quello che pensavo avrei dovuto fare. – JollyJoker

0

Lodash offre una bella alternativa per questa cosa esatta.

P.then(_.bind(doWork, 'myArgString', _)); 

//Say the promise was fulfilled with the string 'promiseResults' 

function doWork(text, data) { 
    console.log(text + " foo " + data); 
    //myArgString foo promiseResults 
} 

Oppure, se si desidera la vostra funzione successo di avere un solo parametro (i risultati promessa realizzata), è possibile utilizzare in questo modo:

P.then(_.bind(doWork, {text: 'myArgString'})); 

function doWork(data) { 
    console.log(data + " foo " + this.text); 
    //promiseResults foo myArgString 
} 

Questo attribuirà text: 'myArgString' al this contesto all'interno della funzione.

1

Utilizzare il curry.

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function(){ 
      resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
}); 

var curriedDoWork = function(text) { 
    return function(data) { 
     console.log(data + text); 
    } 
}; 

P.then(curriedDoWork('text')) 
.catch(
    //some error handling 
);