2016-07-20 2 views
0

私はJavascriptには少し新しく、その非同期的な側面に苦労しています。私のプログラムは2つのオブジェクトの値をチェックします.2つ目のオブジェクトは、チェックを完了するために必要な重要なプロパティを持っていません。だから私はその値/プロパティ(ID)を取得する約束をして、今私はそのID値をチェック関数に渡す必要があります。チェック機能は、IDが一致するかどうかを確認するためにtrue/falseを返すだけです。チェック関数の値は別の関数に渡され、適切に動作し、必要に応じてその内容を編集します。だから私は基本的にそれが括弧の外側のティックの値にアクセスすることはできません。私はこのすべてが起こっているところで私のコードのスニペットを含めました。すべてのことがそれで視覚化しやすいからです。誰かが私にこの問題の解決策を教えてもらえますか?どんなアドバイスでも大いに役立ちます!できるだけスクリプトの変更を最小限に抑えたい。Promiseの値を別の関数に渡すにはどうしたらいいですか?

var Q = require('q'); 

    getID = function(instance, person, callback){ 
      var = deferred = Q.defer(); 
      var url = 'www.blah.com'; 
      var options = { 
       'url': url 
      }; 

      request.get(options, function(error, response, body){ 
       if (error) { 
        deferred.reject(error); 
       }else{ 
        var res = body; 
        var obj = JSON.parse(res); 
        var id = obj.id; 
        deferred.resolve(id); 
       } else deferred(obj); 
      }); 


    check = function(instance, thing1, thing2){ 
     var tick = true; 
     getID(instance, thing2).then(function(id)){ 
      var id_1 = thing1.id; // thing1 passed into check with ID 
      var id_2 = thing2.id; // thing 2 now has id attached to it 
      if(id_1 == id_2){ 
       tick = true; // VALUE 1 
      }else{ 
       tick = false; // VALUE 2 
     }); 

     // NEED VALUE 1 OR 2 OF TICK HERE 

     if(thing1.name == thing2.name){ 
      tick = true; 
     else{ 
      tick = false; 
     } 

     // similar checks to name but with ADDRESS, EMAIL, PHONE NUMBER 
     // these properties are already appended to thing1 and thing 2 so no need to call for them 

    }; 

    editThing = function(instance, thing, callback){ 

     var checked = check(instance, thing1, thing2); 
     if(checked){ 
      // edit thing 
     }else{ 
      // don't edit thing   
    }; 
+0

は 'deffered'を返す' getID'機能ですか?それはあなたのコードスニペットではありません。 – Victory

+0

var Q = require( 'q');一番上にあるはずです! – pokemongirl1234

+0

これは 'getID'の' deferred'オブジェクトを 'check'で使用できるように返すのでしょうか? – Victory

答えて

1

することは、あなたは最終的な出力を望むのコードに沿って約束のパスが必要になります。

私はあなたのポストからコードを書き換えるので、私は言い換えできるようにしようとするつもりはない:

getThing = function(thing){ 
    var deferred = Q.defer(); 
    ... 
    request.get(options, function(error, response, body){ 
    if (error) { 
     deferred.reject(error); 
    } else { 
     ... 
     deferred.resolve(thingMadeFromResponse); 
    } 
    }); 
    return deferred; 
} 

check = function(thingWeHave, thingWeNeedFetched){ 
    return getThing(thingWeNeedFetched).then(function(thingWeFetched)){ 
    // check logic 
    checked = thingWeHave.id == thingWeFetched.id; 
    ... 
    return checked; 
    }); 
}; 

editThing = function(instance, thing, callback){ 
    check(thingWeHave, thingWeNeedFetched).then(function(checked) { 
    if(checked){ 
     // edit thing 
    }else{ 
     // don't edit thing 
    } 
    }); 
}; 
+0

を援助できたことを願っておりますが、私はこの問題をサポートしていますか?私はそれを試して、プログラムが実行されていません。 – pokemongirl1234

+0

blah.comから取得する必要があるものは、すでに手に入れているものが完全にはっきりしていないので、正確に何を渡す必要があるかを知ることは難しいです。私は、あなたがすでに一つのオブジェクトを持っていて、blah.comからフェッチされたデータと比較しようとしているという前提で答えを編集します... – Will

+0

obj1は問題ありませんが、editThingに渡され、関数。私はobID2のidIDをretieveし、一連のチェックを通して両方のオブジェクトを渡す必要があります – pokemongirl1234

-2

Promises

「thenable」は、メソッドを定義するオブジェクトまたは関数です。あなたがやるべき仕事の約束を作っている、とあなたはその仕事からの出力を必要とするので

+0

これで正しいIDを取得する正しい方法がないのですか? – pokemongirl1234

+0

約束は行く方法です。あなたのスクリプトでは、ブラウザ経由で動作するためにポリフィルが必要になります。私が理解しているように、約束はコールバックの代わりになることに注意してください。だから、どちらか一方を使うべきです。可哀想は、約束の互換性を意味する、と私は信じている。 –

+0

polyfillを使用しないで値を取得する方法はありますか?私はあなたがこれによって何を意味するのか理解するのが苦労しています。 – pokemongirl1234

関連する問題