2015-07-06 6 views
1

Есть ли способ в Node.js убить операцию async и не допустить ее завершения (вызов callbacks или разрешение обещания)?Node.js, убивающий асинхронный вызов

Чтобы быть более конкретным, допустим, я сделал звонок http.get(). Это асинхронная операция, которая в конечном итоге вызовет обратный вызов или вызовет событие ошибки. Но это занимает слишком много времени, и логика в моем коде может сказать «эй, я так долго ждала, я не хочу больше ждать!» и делать что-то другое. Проблема в том, что вызов будет вызван, и это может испортить материал! Итак, да, есть ли способ остановить этот обратный вызов от исполнения? Моя идея была:

var notWaitingAnyMore = false; 
http.get({}, function(res) { 
    if(notWaitingAnyMore) { // do stuff! } 
}); 
//do some other stuff 
//now fed up with waiting: 
notWaitingAnyMore = true; 

Но это не кажется, как хорошее решение для меня ...

+0

Сделать это использование обещаниями. Затем засуньте промежуточное обещание, которое также завершится, когда notWaitingAnyMore станет истинным и выбрасывает результат http. – usr

+0

Это то, что вы ищете http://stackoverflow.com/a/8377810/57095? –

+0

Вы хотите установить [тайм-аут на вызов 'http'] (http://stackoverflow.com/questions/6214902/how-to-set-a-timeout-on-a-http-request-in-node)? Стоит отметить, что многие библиотеки JavaScript Promise поддерживают собственные тайм-ауты, которые автоматически обрабатывают это для вас. – tadman

ответ

1

Лучше всего, вероятно, использовать обещания , Например, если вы используете bluebird, эта проблема очень легко решена:

new Promise(function(resolve, reject) { 
    http.get({}, resolve); 
}).timeout(500) // timeout length in ms 
.then(function(res) { 
    // do stuff! 
}).catch(Promise.TimeoutError, function(err) { 
    // do you need to do something after it times out? 
}) 
//do some other stuff 
+0

bluebird звучит неплохо, я проверю его, спасибо :) –

0

Ты супер близко

function outerMethod(input, callback){ 
    var notWaitingAnyMore = false; 
    var maxTimeout = 1000*60; // 1min 
    http.get({}, function(res) { 
    if(!notWaitingAnyMore) { 
     // do stuff! 
     notWaitingAnyMore = true; 
     callback(null, res); 
    } else { 
     return; 
    } 
    }); 
    setTimeout(function(){ 
    // We want to avoid calling back a second time if the http callback ran first: 
    if(!notWaitingAnyMore) { 
     notWaitingAnyMore = true; 
     callback('timeout'); 
    } else { 
     return 
    } 
    }, maxTimeout) 
}; 
Смежные вопросы