2016-01-15 4 views
-1

Мой код выглядит следующим образом:Есть ли способ получить уведомление, когда вызывается обратный вызов asyncFetch?

NetUtil.asyncFetch(url, function(inputStream, status) { 
    var binaryOutputStream = Components.classes['@mozilla.org/binaryoutputstream;1'].createInstance(Components.interfaces['nsIBinaryOutputStream']); 
    var storageStream = Components.classes['@mozilla.org/storagestream;1'].createInstance(Components.interfaces['nsIStorageStream']); 
    var count = inputStream.available(); 
    var data = NetUtil.readInputStreamToString(inputStream, count); 

    storageStream.init(512, count, null); 
    binaryOutputStream.setOutputStream(storageStream.getOutputStream(0)); 
    binaryOutputStream.writeBytes(data, count); 

    global_storageStream = storageStream; 
    global_count = count; 
}) 

Логика требует основной процесс, чтобы быть заблокирован до global_storageStream и global_counter не установлены.

Как я могу это сделать?

+2

Функция является асинхронной. Он не блокирует и не блокирует. Вам нужно будет перестроить свой код в основном процессе, чтобы справиться с этим. Вероятно, вы должны пройти обратный вызов, который вы можете вызывать, когда все будет сделано, и передать последние две переменные этому обратному вызову, а затем поместить ваш другой код, которому нужен результат в обратном вызове. Вот как вы пишете асинхронный код в node.js. – jfriend00

ответ

1

Вы не должны пытаться полностью заблокировать основной процесс. Вместо этого вызовите функциональность с конца вашего обратного вызова.

Вы можете сделать 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); 
Смежные вопросы