2013-02-11 11 views
7

Zaczynam od pierwszej aplikacji javascript GTK i chcę pobrać plik i śledzić jego postępy za pomocą Gtk.ProgressBar. Jedynymi docs mogę znaleźć o żądań HTTP są niektóre przykładowy kod tutaj:Korzystając z programu gjs, jak utworzyć asynchroniczne żądanie http, aby pobrać plik w porcjach?

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

I trochę mylące odniesienia Soup tutaj:

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

Z tego co mogę zebrać, mogę coś zrobić w następujący sposób:

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'); 
} 

Po uruchomieniu pobierania wydaje się, że jest wywołanie zwrotne, a nie mogę znaleźć dowolny sposób ustawienia funkcji zwrotnej dla jakichkolwiek zdarzeń danych. Jak mogę to zrobić?

To jest naprawdę łatwe w 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(); 

Odpowiedz

4

Dzięki pomocy z [email protected], mam zdobione. Okazuje się, że Soup.Message zawiera zdarzenia, z którymi możesz się połączyć, w tym jeden o nazwie got_chunk i jeden o nazwie 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'); 
}); 
Powiązane problemy