2015-08-03 3 views
0

У меня есть функция с аргументом, который я хочу выполнить многократно, в порядке, пока проверка кода состояния не будет правильной.Функция повтора до окончания?

function check(id){ 
    var status = 2; 
    var exit = 0; 
    // set status based on web request with ID param 
    switch(status){ 
     // based on status code, output a message and set exit 0/1 
    } 

    /** Here I want the Function to repeat itself with a delay without skipping until exit is 1 **/ 

} 

Я пробовал использовать библиотеку async.whilst, но я не мог понять, как сохранить идентификатор параметра и использовать функцию обратного вызова.

Я также пробовал метод setTimeout, но он затопил консоль и разбился.

Заранее благодарим за любую помощь, которую вы можете мне дать.

Редактировать

Вот полный код, это довольно гетто, но я новичок в этом событии на основе материала

function checkStatusLoop(tradeID){ //checks if the trade is on-going or not (0 - done, 1 - ongoing) 
    var status = -1; // set default to active 
    var exit = 0; 
    manager.getOffer(tradeID, function(err, offer) { 
     if(err) throw err; 
     status = offer.state; 
    }); 
    switch(status){ 
     case 1: 
      console.log('Trade #' + tradeID + ' Invalid'); 
      exit = 1; 
      break; 
     case 2: 
      console.log('Trade #' + tradeID + ' Active'); 
      exit = 0; 
      break; 
     case 3: 
      console.log('Trade #' + tradeID + ' Accepted!'); 
      exit = 1; 
      break; 
     case 4: 
      console.log('Trade #' + tradeID + ' Countered'); 
      exit = 1; 
      break; 
     case 5: 
      console.log('Trade #' + tradeID + ' Expired'); 
      exit = 1; 
      break; 
     case 6: 
      console.log('Trade #' + tradeID + ' Canceled'); 
      exit = 1; 
      break; 
     case 7: 
      console.log('Trade #' + tradeID + ' Declined'); 
      exit = 1; 
      break; 
     case 8: 
      console.log('Trade #' + tradeID + ' InvalidItems'); 
      exit = 1; 
      break; 
     case 9: 
      console.log('Trade #' + tradeID + ' EmailPending'); 
      exit = 0; 
      break; 
     case 10: 
      console.log('Trade #' + tradeID + ' EmailCanceled'); 
      exit = 0; 
      break; 
     default: 
      console.log('Trade #' + tradeID + ' Bad State!'); 
      exit = 1; 
      break; 
    } 
    if(exit == 0){ 
     setTimeout(function(){ 
      checkStatusLoop(tradeID); 
     }, 2000); 
    } else { 
     return (TradeOfferManager.getStateName(status)); 
    } 
} 

Эта библиотека из GitHub: https://github.com/DoctorMcKay/node-steam-tradeoffer-manager/wiki/TradeOfferManager#getofferid-callback

возгласы, по-видимому есть on ('sentOfferChanged', позор, который я провел хорошо на этом

+0

Не забывайте, что ваш «веб-запрос», вероятно, асинхронный, что означает, что он не вернет значение, и элемент управления немедленно вернется. Поэтому ваш статус всегда будет неопределенным. – plalx

+0

да, что мне делать? Я просто заметил это тоже, впервые выполнив node.js. Хотя петли не работают – user2837329

+0

Это зависит от того, какой API вы используете для выполнения запроса. Является ли это API на основе обещаний (возвращает обещание)? Если это возможно, вы можете написать свой код: function 'check (id) {makeRequest (id). Then (функция (статус) {/ * остальная часть вашего кода идет здесь/*}); } ' – plalx

ответ

2
function check(id){ 
    var status = 2; //default of 2 
    var exit = 0; 

    // set status based on web request with ID param 
    switch(status){ 
     // based on status code, output a message and set exit 0/1 
    } 

    /** Here I want the Function to repeat itself with a delay without skipping until exit is 1 **/ 
    //but I need the browser to update, so I cannot run check immedeately. 
    setTimeout(function() { 
     check(id); 
    }, 100) 
} 

?

+0

Ух ты, я не уверен, почему он не работал раньше, я не использовал анонимную функцию в функции setTimeout, и она рушилась, теперь я чувствую себя совсем немой. – user2837329

+0

По-прежнему не работает должным образом из-за асинхронного запроса ajax ... – plalx

+0

Я пытаюсь сделать что-то вроде цикла while, который идет до тех пор, пока переменная не будет установлена ​​из веб-запроса, но это слишком мусор – user2837329

Смежные вопросы