metodo example javascript promise ecmascript-6 bind apply

javascript - example - ¿Cómo funciona function.apply.bind en el siguiente código?



metodo bind javascript (3)

Así que entiendo que un conjunto de [200,599] se devuelve de la promesa y la función de devolución de llamada dentro de la dispersión se pasa a Function.apply.bind, pero ahora estoy perdido. ¿Cómo se divide la matriz de [200,599] en xey? ¿Cómo funciona exactamente el apply.bind?

function getY(x) { return new Promise( function(resolve,reject){ setTimeout( function(){ resolve( (3 * x) - 1 ); }, 100 ); } ); } function foo(bar,baz) { var x = bar * baz; // return both promises return [ Promise.resolve( x ), getY( x ) ]; } function spread(fn) { return Function.apply.bind( fn, null ); } Promise.all( foo( 10, 20 ) ) .then( spread( function(x,y){ console.log( x, y ); // 200 599 } ) )


La función de dispersión es solo una función de utilidad para convertir una matriz en parámetros pasados ​​a una función. La aplicación está haciendo la conversión, y el enlace lo vincula a la función de llamada para que el contexto "este" esté conectado a la misma función.

Para ver cómo se propaga está trabajando en una forma más simple ->

spread(function (x,y){console.log(x,y);})([1,2])

Obtendrá la respuesta, 1 2, cuando 1 pase a x, y 2 pase a y.

Entonces, en tu ejemplo, tu promesa. Todos devuelven una serie de promesas resueltas. Estos se asignan a los parámetros de su función (x, y).


Spread toma una función y vincula el método apply a, aplicando parcialmente el argumento null . En resumen,

spread(fn)

se transforma a

args => fn.apply(null, args)

que es lo mismo que usar la sintaxis de propagación ES6

args => fn(...args)

de donde la función obtuvo su nombre.

Si quieres la respuesta larga, recuerda lo que hace bind :

method.bind(context, ...args1)

devuelve una función que funciona como

(...args2) => method.call(context, ...args1, ...args2)

En nuestro caso, se apply method , el context es fn y los primeros argumentos son null , por lo que la llamada

Function.apply.bind( fn, null )

creará una función que funciona como

(...args2) => (Function.apply).call(fn, null, ...args2)

que es equivalente a la fn.apply(…) anterior, dado que apply es el método heredado de Function.prototype en ambos accesos.


.apply() es un método sobre objetos de función. Al igual que:

console.log(Math.max.apply(null, [1, 2, 3])); // 3

.apply() acepta dos argumentos, el contexto (lo que se convertiría en this dentro de la función objetivo) y un iterable de argumentos (generalmente una matriz, pero la matriz de arguments como también funciona).

.bind() es un método sobre objetos de función. Al igual que:

const x = { foo: function() { console.log(this.x); }, x: 42 } var myFoo = x.foo.bind({x: 5}); x.foo(); // 42 myFoo(); // 5

.bind() toma un contexto (lo que se convertiría en this ) y, opcionalmente, argumentos adicionales, y devuelve una nueva función , con el contexto vinculado , y los argumentos adicionales bloqueados

Como .apply() es una función en sí misma, se puede vincular con .bind() , de esta manera:

Function.prototype.apply.bind(fn, null);

Lo que significa que this de .apply() sería fn y el primer argumento para .apply() sería null . Lo que significa que se vería así:

fn.apply(null, args)

Que separaría los parámetros de una matriz.