2016-06-03 17 views
1

Mein ursprünglicher Fehler war An attempt was made to use an object that is not, or is no longer, usable. Nach dart2js läuft mit den Standardeinstellungen zu lesen, es ist ziemlich schwierig und ich hatte Schwierigkeiten, die Debug-Ausgaben, so habe ich diese Optionen zu meinem pubspec.yaml:unklarer Fehler von dart2js checked mode

- $dart2js: 
    checked: true 
    sourceMaps: true 
    verbose: true 
    minify: false 

ich etwas erwartet zu brechen, aber ich hatte gehofft, den Fehler Nachricht wäre klar genug, dass ich es ausarbeiten könnte, aber ich verstehe den Fehler, den ich bekomme.

Der neue Fehler Ich erhalte ist:

Error: 
    dart<.wrapException() 
    dart<._rootHandleUncaughtError_closure.call$0() 
    dart<._microtaskLoop() 
    dart<._startMicrotaskLoop<() 
    dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<() 
    dart<.invokeClosure_closure0.call$0() 
    dart<._IsolateContext.eval$1() 
    dart<._callInIsolate() 
    dart<.invokeClosure<() 
    dart<.convertDartClosureToJS/$function</<() 

Es sieht aus wie Dart einige Probleme Umwandlung eines Verschlusses an einer js-Funktion hat. Ich hätte gedacht, dass dies geschehen würde, wenn dart2js ausgeführt wird und nicht während die Anwendung im Browser ausgeführt wird.

Mein Code hat keine expliziten Schließungen, aber ich verwende async await. Habe ich recht, wenn ich annehme, dass diese in Schließungen umgewandelt werden?

Nur für den Fall, dass es relevant ist, verwende ich auch Angular2.

aktualisieren

Es scheint, dass sind meine Probleme durch meine Verwendung des HttpRequest.request() von dart:html verursacht wird.

HttpRequest res = await HttpRequest.request("${API_URL}/login", 
    method  : "POST", 
    responseType: "json", 
    mimeType : "application/json", 
    sendData : JSON.encode(req_data)); 

print(res.status); 

Wenn ich geprüft Modus zu entfernen und bauen diese mir die An attempt was made to use an object that is not, or is no longer, usable Fehler gibt.

+0

Sie könnten 'pub build --mode = debug 'versuchen, um Baum-Shaking und Minification zu deaktivieren.Wie sieht das Skript-Tag aus, mit dem Sie das Dart-Skript zu "index.html" hinzufügen? Könnte ein Zeitproblem sein. –

+0

Ich gebe '--mode = debug' und sage dir was ich bekomme. Ich verwende diese Script-Tags: '' ' ' – Hector

+0

Können Sie das Projekt (reduzieren durch alles, was nicht absolut notwendig ist zu reproduzieren) zu einem GitHub-Repository veröffentlichen? –

Antwort

1

Es scheint, dass ich das Problem behoben habe, indem ich meine Verwendung der Klasse HttpRequest geändert habe.

Von:

HttpRequest res = await HttpRequest.request("${API_URL}/login", 
    method  : "POST", 
    responseType: "json", 
    mimeType : "application/json", 
    sendData : JSON.encode(req_data)); 

print(res.status); 

An:

HttpRequest res = new HttpRequest() 
    ..open("POST", "${API_URL}/login"); 

req 
    ..onLoadEnd.listen((ProgressEvent e) { 
     print(res.status); 
    }) 
    ..send(JSON.encode(req_data)); 

Ich bin mir nicht sicher, was das eigentliche Problem war, aber auf diese Weise ich nicht bekommen, entweder die InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable oder je länger dart Fehler:

Error: 
    dart<.wrapException() 
    dart<._rootHandleUncaughtError_closure.call$0() 
    dart<._microtaskLoop() 
    dart<._startMicrotaskLoop<() 
    dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<() 
    dart<.invokeClosure_closure0.call$0() 
    dart<._IsolateContext.eval$1() 
    dart<._callInIsolate() 
    dart<.invokeClosure<() 
    dart<.convertDartClosureToJS/$function</<() 

Meine Vermutung ist, dass dart2js ist hving einige Probleme mit async await "implizite" Schließungen und ist viel glücklicher, wenn ich eine "explizite hier ist eine Funktion, die über ihre Umgebung schließt" schließen.

Danke an Günter Zöchbauer für die Hilfe.

2

Die API ist besser, intuitiver bedienen. Zum Beispiel Anfrage:

var client = new BrowserClient(); 

var response = await client.post("${API_URL}/login", 
           body: JSON.encode(req_data)); 
var data = JSON.decode(response.body); 
client.close(); 

Und Sie könnten wahrscheinlich in den Parametern sehen, wenn Sie mehr Präzision in der Art und Weise Sie Ihre Anfrage definieren möchten möchten.

+0

Sie könnten Ihre vorhandene Antwort bearbeiten, anstatt eine neue zu erstellen. –

+0

Danke. Dieser arbeitet jetzt, aber ich werde das für das nächste Mal beachten :) – Hector