Вы не должны пытаться полностью заблокировать основной процесс. Вместо этого вызовите функциональность с конца вашего обратного вызова.
Вы можете сделать global_storageStream
null и продолжать проверять это, но это плохая идея. Вы будете делать это неправильно, если это ваше решение.
Здесь я показываю несколько шагов, чтобы сделать ваш код постепенно лучше и более многоразовым. Возможно, лучше и легче перейти к шагу 2 сразу.
Шаг 1: Вызов логики после Глобалы установлены
Вы должны каким-то образом добавить последующую логику до конца вашей функции обратного вызова. Итак, первый шаг - просто положить его туда. Конечно, вам больше не нужны глобалы.
NetUtil.asyncFetch(url, function(inputStream, status) {
// Current code clipped for brevity
// Don't need the globals anymore
// global_storageStream = storageStream;
// global_count = count;
// Code that uses the global storageStream and count can be refactored
// to use just the local storageStream and count.
yourRefactoredMainProcessLogic.... // Put your logic here.
})
Шаг 2: Вызов отдельной функции и передать аргументы Или вы можете обернуть логику в другой функции, которую вы называете впоследствии.
function afterMath (storageStream, count) {
// Refactored code of previous step goes here.
yourRefactoredMainProcessLogic....
}
NetUtil.asyncFetch(url, function(inputStream, status) {
// Current code clipped for brevity
afterMath(storageStream, count);
})
Шаг 3: Wrap в функции обратного вызова с
Может быть, вы можете обернуть его таким образом, чтобы вы могли легко назвать его, и передать свой собственный обратный вызов будет называться впоследствии. Таким образом, у вас есть простая, многоразовая функция.
function asyncFetchToStream(url, callback) {
NetUtil.asyncFetch(url, function(inputStream, status) {
// Current code clipped for brevity
// Globals still removed, of course.
// Instead of fixed function, call the callback.
callback(storageStream, count);
})
}
И тогда вы можете вызвать эту функцию следующим образом:
asyncFetchToStream('YourUrl', function(storageStream, count){
// Refactored code of step 1 goes here.
yourRefactoredMainProcessLogic....
});
или, по-прежнему вызывая функцию с именем afterMath
из предыдущего шага:
asyncFetchToStream('YourUrl', afterMath);
Функция является асинхронной. Он не блокирует и не блокирует. Вам нужно будет перестроить свой код в основном процессе, чтобы справиться с этим. Вероятно, вы должны пройти обратный вызов, который вы можете вызывать, когда все будет сделано, и передать последние две переменные этому обратному вызову, а затем поместить ваш другой код, которому нужен результат в обратном вызове. Вот как вы пишете асинхронный код в node.js. – jfriend00