2016-10-26 4 views
-1

私はJavaスクリプトの.thenチェインで混乱しています。把握しようとすると、以下の問題を解決できませんでした。Javaスクリプトのチェーンチェンジがこのコンテキストを失う

私はthis.arrayAとthis.arrayBの2つの配列を持っていますが、functionAとfuncitonBはそれらをそれぞれ移入してから、それらの2つの配列をfuncitonCで使いたいと思います。

return functionA(this) //returns promise resolve , populates this.arrayA 
.then(functionB(this)) //returns promise resolve , populates this.arrayB 
.then(functionC(this)) //returns promise rejected if condition=true else resolves promise 

は、私は以下のようにそれを割り当てることで、「この」コンテキストを渡すためにしようとしていますが、私は常に参照を失っと関数Bに私はいつもfunctionA.Iの出力は以下のコードを試してみましたが、それは動作しません取得します。

var self = this; 
return functionA(this) //returns promise resolve , populates this.arrayA 
.then(functionB.bind(self)) //returns promise resolve , populates this.arrayB 
.then(functionC.bind(self)) //returns promise rejected if condition=true else resolves promise 

var _ = require('loadash'); 
functionA(that){ 
    return new Promise(function(resolve, reject) { 
    resolve(
    _.each(that.items1, function(item1){ 
      var someStruct = { 
       name: item1.name, 
       type: item1.type 
      } 
      that.arrayA.push(someStruct); 
     }  
    )  
    }); 
} 

functionB(that){ 
    return new Promise(function(resolve, reject) { 
    resolve(
    _.each(that.items2, function(item2){ 
      var someStruct = { 
       name: item2.name, 
       type: item2.type 
      } 
      that.arrayB.push(someStruct); 
     }  
    )  
    }); 
} 

functionC(that){ 
    return new Promise(function(resolve, reject){   
    _.each(that.arrayA, function(someItems){ 
     _.find(that.arrayB , function(someMoreItems){ 
       if (someItem.name === someMoreItems.name && someItem.type != someMoreItems.type){ 
       reject(Error("it's broken")) 
       }else{ 
       resolve() 
       } 
     });    
    }); 
    }); 
} 

この問題を解決できるように教えてもらえますか?

おかげ

+3

は、... 2番目のスニペットが見えます(あなたドン最初のスニペットでやっていることとは違って、それぞれの関数を 'this'にバインドするだけです。) - 関数が何をしているのかを見ることなく、誰が –

+0

のコードを表示しているのでしょうか? 'functionC' –

+0

とBとAは実際に何が起こっているか見るために –

答えて

0
変数へ

ストアコンテキストthis、その変数を毎回使用しています。

+0

変数はfunctionAの後のコンテキストも失います。 – Galileo123

+0

私は毎回コンテキスト 'this'を失っていましたが、すべての関数の変数に代入しても問題ありませんでした。関数呼び出しの初めに一度だけ割り当てました。 – Galileo123

+0

素晴らしい! upvote pls。 –

0

Promiseコンストラクタにオブジェクトではなく関数を送信してみます。

ので、代わりに

new Promise({}) 

のあなたは

new Promise(function(){}) 

アップデートを必要とする - 2を推測:

あなたが外this機能のthisに結合され、しかし決して使用しないd。 thisではなく、最初のパラメータをバインドします。

は、上記のコードの別の問題は、約束がfunctionCで解決し、拒否された方法です

functionX.bind(null, this) 
+0

完全な例を私たちに提供していないので、これはちょうど推測です。また、サンプルで使用するすべてのライブラリ(アンダースコアなど)にタグを付ける必要があります。 – destoryer

+0

あなたが正しいと思う賢明な構文です。私は新しいPromise(function(){})を使用しましたが、上のスニペットでそれを逃しました。しかし、それは違いはありません。 – Galileo123

+0

別の問題の答えを確認してください。 – destoryer

0

中に、

functionX.bind(self) 

を変更してみてください。プロミスの状態を設定すると、関数の場合には変更されません。反復のカップルが解決する約束を設定していて、if文を満足させる条件がreject()を再度設定することができません。だから私はブールフラグを設定し、両方のループの外側のフラグを評価しました。また、私はreturnに設定するだけで、それを返すことはありません。それは仕事ができるように、すべての機能をすぐに呼ばれていたため、問題が何であるか...最初のスニペットが失敗する運命だったと言うことができ、各関数が何をするのか見ずに

return functionA(this) //returns promise resolve , populates this.arrayA 
.then(functionB.bind(this)) //returns promise resolve , populates this.arrayB 
.then(functionC.bind(this)) //returns promise rejected if condition=true else resolves promise 


functionA(that){ 
    self.arrayB = []; 
    return new Promise(function(resolve, reject) { 
    _.each(that.items1, function(item1){ 
     var someStruct = { 
      name: item1.name, 
      type: item1.type 
     } 
     resolve(that.arrayA.push(someStruct)); 
    }  

    }); 
} 

functionB(){ 
var self = this; 
self.arrayB = []; 
return new Promise(function(resolve, reject) {  
_.each(self.items2, function(item2){ 
     var someStruct = { 
      name: item2.name, 
      type: item2.type 
     } 
     resolve(self.arrayB.push(someStruct)); 
    }    
}); 
} 

functionC(){ 
    var self = this; 
    var promiseStatus = false; 
    return new Promise(function(resolve, reject){   
_.each(self.arrayA, function(someItems){ 
    _.find(self.arrayB , function(someMoreItems){ 
      if (someItem.name === someMoreItems.name && someItem.type != someMoreItems.type){ 
       promiseStatus = true;    
      } 
     });   
}); 
if (promiseStatus){return reject(Error('it broken'))} 
else {return resolve();} 
}); 
} 
関連する問題