2016-07-11 7 views
0

私のコードを単純化して問題を表示しようとしました。 コールバックでグローバル変数を設定する

var rp = require('request-promise'); 
var ids = []; 

runmyFunction(); 
runmyFunction(); 

function runmyFunction() { 
    var id = 5; 
    console.log("runmyFunc: "+ids); 
    if (ids.indexOf(id)==-1){ 
     myFunction(id); 
    } 
} 

function myFunction(id) { 
    var options = { 
     uri: 'someURI' 
     , headers: { 
      'User-Agent': 'Request-Promise' 
     } 
     , json: true 
    }; 
    rp(options) 
     .then(function (response) { 
      ids.push(5); 
      console.log("myFunc: "+ids); 
     }) 
     .catch(function (err) { 
      console.log(err); 
     }); 
} 

は基本的に私はそれのid 12345が存在しない場合にのみ myFunctionを実行する必要があり、この機能 runmyFunctionを、持っています。だから、もし私が10回実行し、11回目のid 12345が返されたら、関数の実行を止めるべきです。 問題は、要求が成功した場合でもIDが配列にプッシュされることはありません。

同様の問題は、要求が非同期であることと関係していました。これも私のコードの原因ですか?

//編集私はそれを使い、コードを編集しました。現在のコードはこれをコンソールに記録します:

runmyFunc: 
runmyFunc: 
myFunc:5 
myFunc:5,5 

これは非同期なのでです。それを避けるためのあらゆるアイデア?

+0

IDはリクエストに由来するため、実際にリクエストIDを確認することはできません。あなたは他の論理を見つける必要があります。 – Shilly

+0

申し訳ありませんが、関数が複数回実行され、idが配列内にある場合は停止することを明確にしていませんでした。私はそれを修正した。 – Trojan

+0

IDを1つずつ呼び出す場合は、各IDの到着後にチェックを実行してください。それが12345でなければ、myFunctionが再度起動させてください。 PS:IDが実際に受信しているデータに含まれているかどうかを確認しましたか? – Shilly

答えて

0

おかげで、私は別の配列を追加することによって、自分で解決策を見つけました。これはただで働いたbeeingている間、それはブロックを取得するように、別の配列への要求によって「使用中」まま現在あるidを追加して何

var rp = require('request-promise'); 

var ids = []; 
var idstmp = []; 

runmyFunction(); 
runmyFunction(); 

function runmyFunction() { 
    var id = 5; 
    if (ids.indexOf(id) == -1 && idstmp.indexOf(id) == -1) { 
     console.log("I was here."); 
     idstmp.push(id); 
     myFunction(id); 
    } 
} 

function myFunction(id) { 
    var options = { 
     uri: 'someURI' 
     , headers: { 
      'User-Agent': 'Request-Promise' 
     } 
     , json: true 
    }; 
    rp(options) 
     .then(function (response) { 
      idstmp.splice(idstmp.indexOf(id), 1); 
      ids.push(id); 
      console.log("myFunc: " + ids); 
     }) 
     .catch(function (err) { 
     idstmp.splice(idstmp.indexOf(id), 1); 
     }); 
} 

。それはかなりの回避策ですが、私のために働く。

0

ないように注意してくださいしかし、私はあなたの問題は多分助け.bind()を使用することによって解決されると思う:@Shillyへ

var rp = require('request-promise'); 
var ids = []; 


function runmyFunction() { 
    if (ids.indexOf(12345)==-1){ 
    myFunction(); 
    } 
} 

function myFunction() { 
    var options = { 
    uri: 'someURI' 
    , headers: { 
     'User-Agent': 'Request-Promise' 
    } 
    , json: true 
}; 
rp(options) 
    .then(function (response,mids) { 
     mids.push(response.data.id); 
    }.bind(ids)) 
    .catch(function (err) { 
     console.log(err); 
    }); 
} 
+0

ここで何をしようとしているのか分かりません。バインディングは関数のスコープ(この参照)を変更します。 – Shilly

+0

@ Shilly私は問題が "then"関数で "this"の範囲外であると思うので、 "ids"配列を引数として渡すことを考えています。それは私が最初に私が確信していないと言った理由です。 – pooyan

+0

このrequest-promiseライブラリは標準のfunction.bind()メソッドを上書きしますか?それ以外の場合は、このコンテキストがコールバックで使用されないため、これはまったく意味がありません。 – Shilly

関連する問題