2016-12-29 14 views
0

私はいくつかのバインドの説明を探知しましたが、まだ非常に混乱しています。私は以下の方法で約束を縛って使用しています。それは働いていますが、私は理由を知らない。誰かが私が得た小さな問題を説明して助けてくれることを願っています。ノードバインドと約束

var temp1 = function(){ 
    return new Promise(function(resolve, reject){ 
     resolve("hello"); 
    }); 
}; 

var temp2 = function(para1, para2){ 
    console.log("1:", para1); 
    console.log("2:", para2) 
    return new Promise(function(resolve, reject){ 
     resolve(para1+" "+para2); 
    }); 
}; 

temp1().then(temp2.bind(null,"world")).then(function(out){ 
    console.log(out); 
}); 

出力:

1:世界2 \:\こんにちは 世界\こんにちは、それは作ることができるので、私は "バインド" を使用

ここでのサンプルコードはありますコードクリーナー、エラー処理が容易な場合は、次のコードを使用する必要があります。

temp1().then(function(out1){ 
    return temp2(out1, "world").then(function(out2){ 
     console.log(out2); 
    }); 
}); 

temp1().then(function(out1){ 
    return temp2(out1, (out1.length).to_String()).then(function(out2){ 
     console.log(out2); 
    }); 
}); 

ため しかし、それは次のようになります。私は常にチェーンを壊したり、それを達成するために、追加のチェーンを追加することができます知っている

temp1().then(temp2.bind(null,/*the second param is a property of the output from temp1*/)).then(function(out){ 
    console.log(out); 
}); 

:、私は次の質問を持っているか、バインド作品のほか

チェーンを壊さないために素晴らしいです。

私の2つの質問:1.バインドのしくみ、2.チェーンを保持する方法(追加のチェーンもない)、その中の次の関数のパラメータで以前の出力のプロパティにアクセスできます。 ありがとう!

答えて

1

Function.prototype.bind()

バインド()メソッドは、新しい関数が呼び出されたときに提供される任意の前の引数の指定された配列と、呼び出されたとき、そのこのキーワードが提供された値に設定されている、新たな機能を作成します。

技術的には、temp2.bind(null,"world")は関数を返し、パラメータとしてnull,"world"を渡します。そして、これらのパラメータはtemp1の結果である"hello"のインデックス0にマージされます。したがって、実際のパラメータはtemp2に渡され、"hello", "world"です。

あなたが書くことができますチェーンを維持するには、次のあなたがうまくそれらをチェーンできるように、人々は約束を作成した理由は

temp1() 
    .then(function (out) { 
    return temp2(out,"world") 
    }) 
    .then(function(out){ 
    console.log(out); 
    }); 

です。あなたが与えた例はうまくいきますが、コールバック地獄に似ています。

+0

定義によれば、引数は「指定されたものの前にあります」という結果が "hello"、 "world"ではなく "world" "、 "こんにちは"。私はまだ引数がなぜ「ヌル」ではないのか分からない。最初のヌルはどこかで食べられるようです。 –

0

bind()は、後で呼び出される関数の適切なコンテキストを設定するために使用されます。私はあなたがこのシナリオでそれを使う必要はないと思う。

temp1() 
    .then(out1 => temp2(out1, out1.length.toString())) 
    .then(console.log) 
    .catch(console.log); 

これは、暗黙的なリターンを使用しています:あなたはes6を使用している場合は、そのような何かを行うことができます。 temp2()もpromsieを返すので、次の約束レゾルバにチェーンすることができます