2013-02-11 15 views
7

Ich beginne mit meiner ersten Javascript GTK App und ich möchte eine Datei herunterladen und den Fortschritt mit einer Gtk.ProgressBar verfolgen. Die einzigen docs ich über HTTP-Anfragen sind einige Beispiel-Code finden Sie hier:Wie können Sie mithilfe von gjs eine asynchrone HTTP-Anforderung zum Herunterladen einer Datei in Blöcken erstellen?

http://developer.gnome.org/gnome-devel-demos/unstable/weatherGeonames.js.html.en

Und einige verwirrende Suppe Referenz hier:

http://www.roojs.org/seed/gir-1.2-gtk-3.0/gjs/Soup.SessionAsync.html

Von dem, was ich sammeln kann, kann ich etwas tun wie folgt:

const Soup = imports.gi.Soup; 

var _httpSession = new Soup.SessionAsync(); 
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); 

var request = Soup.Message.new('GET', url); 
_httpSession.queue_message(request, function(_httpSession, message) { 
    print('download is done'); 
} 

Es scheint nur einen Rückruf zu geben, wenn der Download abgeschlossen ist, und ich kann nicht finden Sie eine Möglichkeit, eine Rückruffunktion für Datenereignisse festzulegen. Wie kann ich das machen?

Das ist wirklich einfach in node.js:

var req = http.request(url, function(res){ 
    console.log('download starting'); 
    res.on('data', function(chunk) { 
    console.log('got a chunk of '+chunk.length+' bytes'); 
    }); 
}); 
req.end(); 

Antwort

4

Dank der [email protected] zu helfen, ich habe es herausgefunden. Es stellt sich heraus, dass Soup.Message über Ereignisse verfügt, an die Sie binden können, einschließlich eines namens got_chunk und eines namens got_headers.

const Soup = imports.gi.Soup; 
const Lang = imports.lang; 

var _httpSession = new Soup.SessionAsync(); 
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); 

// variables for the progress bar 
var total_size; 
var bytes_so_far = 0; 

// create an http message 
var request = Soup.Message.new('GET', url); 

// got_headers event 
request.connect('got_headers', Lang.bind(this, function(message){ 
    total_size = message.response_headers.get_content_length() 
})); 

// got_chunk event 
request.connect('got_chunk', Lang.bind(this, function(message, chunk){ 
    bytes_so_far += chunk.length; 

    if(total_size) { 
    let fraction = bytes_so_far/total_size; 
    let percent = Math.floor(fraction * 100); 
    print("Download "+percent+"% done ("+bytes_so_far+"/"+total_size+" bytes)"); 
    } 
})); 

// queue the http request 
_httpSession.queue_message(request, function(_httpSession, message) { 
    print('Download is done'); 
});