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); 
     }); 
} 

В принципе у меня есть эта функция runmyFunction, которая должна выполнять только myFunction если не идентификатор 12345 в нем. Поэтому, если я запустил его 10 раз, а 11-й возвращает id 12345, он должен прекратить выполнение функции. Проблема заключается в том, что идентификатор никогда не попадает в массив, даже если запрос преуспел.

Аналогичные проблемы связаны с тем, что запрос является асинхронным. Является ли это причиной и в моем коде?

// edit Я играл с ним и редактировал код. Текущий код записывает это в консоль:

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

Это потому, что это асинхронный. Любые идеи, чтобы избежать этого?

+0

Поскольку идентификатор пришел из запроса, вы никогда не сможете проверить идентификаторы запроса, прежде чем вы их получите. Вам нужно будет найти другую логику. – Shilly

+0

Извините, я не дал понять, что хочу, чтобы функция выполнялась несколько раз и останавливалась, если идентификатор находится в массиве. Я исправил это. – Trojan

+0

Если вы вызываете идентификатор один за другим, просто запустите проверку после прибытия каждого идентификатора. если это не 12345, пусть myFunction снова запустится. PS: вы проверили, действительно ли идентификаторы находятся в данных, которые вы получаете? – Shilly

ответ

0

Благодаря @Shilly я нашел решение самостоятельно, добавив еще один массив.

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); 
     }); 
} 

Что это делает только добавляет идентификаторы, которые curently «используется» по запросу в другой массив поэтому он получает блок в то время как неоспоримым работал. Это довольно обходное решение, но работает для меня.

0

не уверен, но я думаю, ваша проблема будет решена с помощью .bind() возможно поможет:

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» мы вышли из области «этого», поэтому я думаю о передаче массива «ids» в качестве аргумента. вот почему я сказал сначала, что не уверен. – pooyan

+0

Эта библиотека запросов и обещаний перезаписывает стандартный метод function.bind()? Иначе это не имеет никакого смысла, поскольку этот контекст не используется в обратном вызове. – Shilly