2016-07-11 4 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가 반환되면 함수 실행을 중단해야합니다. 문제는 요청이 성공하더라도 배열에서 푸시되지 않는다는 것입니다.

비슷한 문제가 비동기 요청과 관련이있었습니다. 이것이 내 코드에서도 마찬가지입니까?

// 편집 나는 그것과 함께 놀아서 코드를 편집했다. 현재 코드는 콘솔에 다음을 기록합니다 :

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

비동기이기 때문에이 코드를 콘솔에 기록합니다. 그 아이디어를 피하기 위해?

+0

ID는 요청에서 나온 것이므로 실제로 요청 ID를 확인하기 전에 확인할 수 없습니다. 다른 논리를 찾아야합니다. – Shilly

+0

죄송 합니다만, 함수가 여러 번 실행되고 id가 배열에있는 경우 중지하도록 분명히하지 않았습니다. 나는 그것을 바로 잡았다. – Trojan

+0

ID를 하나씩 호출하는 경우 각 ID가 도착한 후 확인을 실행하십시오. 12345가 아니면 myFunction이 다시 트리거됩니다. 추신 : 귀하의 ID가 실제로 귀하가받는 데이터에 있는지 확인 했습니까? – Shilly

답변

0

덕분에 나는 다른 배열을 추가하여 자신에 의해 해결책을 발견했다. 이것은 단지와 함께 일에 beeing하면서 블록을 얻을 수 있도록 다른 배열의 요청에 의해 '사용'curently있는 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