javascript promise beispiel - Wie funktioniert function.apply.bind im folgenden Code?




2 Answers

Die Spread-Funktion ist nur eine Dienstprogrammfunktion zum Konvertieren eines Arrays in Parameter, die an eine Funktion übergeben werden. Die Anwendung führt das Konvertieren aus, und die Bindung bindet sie an die aufrufende Funktion, so dass der Kontext "this" mit derselben Funktion verbunden ist.

Um zu sehen, wie Spread in einer einfacheren Form funktioniert ->

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

Sie erhalten die Antwort 1 2, wenn 1 an x ​​übergeben wird und 2 an y übergeben wird.

In deinem Beispiel gibt dein Versprechen also eine Reihe von gelösten Versprechen zurück. Diese werden dann auf Parameter Ihrer Funktion (x, y) abgebildet.

promises then

So bekomme ich, dass ein Array von [200,599] von der Verheißung zurückgegeben wird und die Callback-Funktion innerhalb Spread in Function.apply.bind übergeben wird, aber jetzt bin ich verloren. Wie ist das Array von [200,599] in x und y aufgeteilt? Wie funktioniert die 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
    } )
)



.apply() ist eine Methode für Funktionsobjekte. Wie so:

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

.apply() akzeptiert zwei Argumente, den Kontext (was innerhalb der Zielfunktion innerhalb der Zielfunktion entstehen würde) und ein iterbares Argument (normalerweise ein Array, aber auch das arguments funktioniert).

.bind() ist eine Methode für Funktionsobjekte. Wie so:

const x = {
  foo: function() {
    console.log(this.x);
  },
  x: 42
}

var myFoo = x.foo.bind({x: 5});

x.foo(); // 42
myFoo(); // 5

.bind() nimmt einen Kontext (was wird dies werden) und optional zusätzliche Argumente und gibt eine neue Funktion mit dem Kontext gebunden und die zusätzlichen Argumente gesperrt

Da .apply() eine Funktion in sich selbst ist, kann sie wie .bind() mit .bind() werden:

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

Das heißt, dass das von .apply() fn und das erste Argument von .apply() wäre null . Das heißt, dass es so aussehen würde:

fn.apply(null, args)

Welches würde die Parameter von einem Array verbreiten.




Related