我的代码如下:
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之前保持阻塞状态。
我该怎么办?
答案 0 :(得分: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步:使用回调函数包装
也许你可以用这样的方式包装它,这样你就可以轻松地调用它,并传递你自己的回调以便随后调用它。这样,您就拥有了一个简单,可重复使用的功能。
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);