2016-10-06 2 views
6

私は[200,599]の配列が約束から戻ってきて、spread内のコールバック関数はFunction.apply.bindに渡されていますが、今は失われています。 [200,599]の配列はどのようにxとyに分割されていますか? apply.bindはどのくらい正確に動作しますか?function.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 
    }) 
) 
+0

あなたは彼ら自身が何をしているのか、あなたは知っていますよね? – Bergi

答えて

2

spread関数は、配列を関数に渡すパラメータに変換する単なるユーティリティ関数です。適用は変換を行い、バインドはそれを呼び出し関数にバインドして、 "this"コンテキストが同じ関数に接続されるようにします。

スプレッドはシンプルな形で働いているかを確認するには - >

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

1をxに渡され、2がyに渡されるようあなたは、答えは、1〜2を取得します。

あなたの例では、promise.allは解決された約束事の配列を返しています。 これらは、関数(x、y)のパラメータにマップされます。

2

スプレッドは、bindsapply methodに部分的にnull引数を適用して機能します。

spread(fn) 

、短期でそうES6を使用するのと同じです

args => fn.apply(null, args) 

に変換され、関数からその名前を得た構文

を広げます。


あなたが長い答えをしたい場合は、bindが何をするか覚えている:

method.bind(context, ...args1) 

contextがあり、methodapplyで、私たちの場合は

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

のように働く機能を返します。 fnで、最初の引数はnullなので、

Function.apply.bind(fn, null) 

applyが両方のアクセスにFunction.prototypeから継承された方法であることを考えると、上記fn.apply(…)呼び出しに相当する

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

ように動作する機能を作成します。

3

.apply()は、関数オブジェクトのメソッドです。これと同じように:

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

.apply()二つの引数、コンテキスト(何が目的関数の内部thisになる)と引数の反復可能(通常の配列だけでなく、のようなarguments配列を受け入れ作品)。


.bind()は、関数オブジェクトのメソッドです。これと同じように:

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

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

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

.bind()文脈でをバインド、および、(何がthisなる)コンテキストをとり、必要に応じて、追加の引数、および新機能を返します。追加の引数がロックされている


thisfnだろうと.apply()への最初の引数がnullになることを意味

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

:自体の関数である、それはそうのように、.bind()で結合することができます。これは次のようになります。

fn.apply(null, args) 

これは、配列からパラメータを広げることになります。

関連する問題