2014-11-25 15 views
2

進度處理程序已被棄用,在幾個領先的承諾庫(QWhen藍鳥),並且也已經在新Promises/A+ spec下降。雖然我理解其背後廢除進度事件的原因,我無法再保理,我已經變得相當用於以下模式:承諾:重構進展時進度更新的數量是未知

var download = function(url) { 
    var deferred = Q.defer(); 
    ... 
    http.get(url, function(res) { 
    res.on('data', function(chunk) { 
     data += chunk.toString(); 
     deferred.notify('Downloading: ' + (data.length/totalLength) + '%'); 
     /* ^Notify download progress, but progress events are now deprecated :(*/ 
    }); 
    res.on('end', function() { 
     deferred.resolve('Success: ' + url); 
    }); 
    res.on('error', function(err) { 
     deferred.reject(err); 
    }); 
    }); 
    return deferred.promise; 
} 
... 
download(url).then(console.log, console.log, console.log); 
/* ^The third handler keeps logging progress, but this is now deprecated :(*/ 

我見過的代碼重用因素例子彈出網絡上的任何地方,但在所有這些例子中,進度更新的數量似乎事先已知。在上述模式中,可能發佈的進度更新數量不確定。

有沒有人可以幫助我實現上述模式而不使用進度事件/處理程序?

回答

1

進展的問題在於它與承諾是正交的,而且沒有很好的組合。你這樣做的方式來自於功能。

我會做(您也可以在藍鳥API文檔閱讀)的方式是沿着這些路線的東西:

var download = function(url, newData) { 
    var deferred = Q.defer(); 
    ... 
    http.get(url, function(res) { 
    res.on('data', function(chunk) { 
     data += chunk.toString(); 
     if(typeof newData === "function") newData(data); 
    }); 
    res.on('end', function() { 
     deferred.resolve('Success: ' + url); 
    }); 
    res.on('error', function(err) { 
     deferred.reject(err); 
    }); 
    }); 
    return deferred.promise; 
} 
... 
download(url, logOnNewData).then(log, log); 

另外請注意,你可以/應該有利於deferreds的使用承諾構造因爲它是安全的。

+0

太棒了!謝謝。是的,我想重新考慮的原因之一是,我不必再使用*延期*。 – 2014-11-25 12:32:42