2016-10-01 6 views
0

私はNodeを初めて使い、関数を呼び出して、最初の関数の結果に基づいて次の関数を呼び出すかどうかを決定したい。関数は非同期なので、結果はすぐには分かりません。以下のコードはうまくいきますが、今度は非同期関数を追加してそれらをすべて連鎖させたいと思います。Q約束 - 使い方は?

var doSomething = require('./custom-module1.js'); //returns a boolean 
var doAnotherThing = require('./custom-module2.js'); //returns a double 

var var1 = process.argv[2]; 
var var2 = process.argv[3]; 
var var3 = process.argv[4]; 

doSomething(var1, var3, function(data) { 
    if (data) { 
     doAnotherThing(var1,var2, function(data){ 
      console.log(var1 + ' is value: ' + data); 
     }); 
    } 
}); 

約束を使用してコードを作成します。

getListOfStuff() 
.then(
    for(i=0;i<data.length;i++) { 
     doSomething(data[i], var3) 
     .then(
      if (doSomething returns true) { 
      doAnotherThing(data[i], var2) 
      .then(doYetAnotherThing(data[i])) 
      .then(andEvenMoreThingsToBeDone(data[i])) 
      } 
     ); 
    } 
); 

私はqについて読んで、denodefiyを使っていますが、それを動作させるための構文を理解できません。私のカスタムモジュールを変更して、約束を返すようにするのがベストでしょうか?私はコンセプトを取得しますが、シンタックスは取得しません。どのように実際に行うのですか?

私は次の2つの異なる表記法を使用して脱変性しようとしました。

var doSomethingDN = Q.denodeify(doSomething); 
var doAnotherThingDN= Q.denodeify(doAnotherThing); 

doSomethingDN(var1, var3) 
.then(
    if(!data) { 
     doAnotherThingDN(var1,var2) 
    } 
); 

そして、取得した場合、この1

var doSomethingDN = Q.nfbind(doSomething); 
var doAnotherThingDN= Q.nfbind(doAnotherThing); 

doSomethingDN (var1, var3) 
.then(
    if(!data) { 
     doAnotherThingDN(var1,var2) 
    } 
); 

ザ・予期しないトークンエラーです。私が削除した場合、両方が実行されますが、doSomethingのboolean結果はプログラムフローを制御することができません。

+0

これは、約束を使用しない非同期コードに約束を追加する一般的なチュートリアルを求めているようです。このことについて既に書かれた1トンがありますので、あなたがそのプロセスで特に理解できないことを理解しているならば、私たちがあなたを助けるのは簡単でしょう。ここでの質問は、一般的な目的のチュートリアルを要求しているように見えるので、あまりにもうまく機能しません。 – jfriend00

+0

"*私のカスタムモジュールを変更して、約束したものを元に戻すことができるでしょうか?" - はい、間違いなく – Bergi

+0

[既存のコールバックAPIを約束に変換するにはどうすればいいですか?](http: //stackoverflow.com/q/22519784/1048572) – Bergi

答えて

0

あなたはまだ約束でコールバック関数を使用する必要があります。

doSomethingDN (var1, var3) 
.then(function(data) { 
// ^^^^^^^^^^^^^^^^ 
    if (!data) { 
     return doAnotherThingDN(var1,var2) 
    } 
}); /* 
^ 

あなたが右thenの引数として関数本体を置くので、あなたは構文エラーを取得しました。

+0

if文が評価されません。私はリターンの前にコンソールログを追加し、出力は得られませんでした。 – Jordan

+0

私はあなたの以前の提案に続き、それが今、この 'のdoSomething(VAR1、VAR3).then(機能(応答){ \t場合(!応答){ \t \t doAnotherThing(VAR1、同じように動作して約束を返すようにカスタムモジュールを変更var2の).then(機能(データ){ \t \t \t戻りデータ; \t \t}); \t} }); '私の謝罪は、私が見やすくするために、コードをフォーマットする方法がわかりません。 – Jordan

関連する問題