有没有办法在调用asyncFetch的回调时得到通知?

时间:2016-01-15 06:18:34

标签: javascript firefox-addon-sdk mozilla

我的代码如下:

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之前保持阻塞状态。

我该怎么办?

1 个答案:

答案 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);