Непонятная ошибка из проверенного режима dart2js

Моя первоначальная ошибка была An attempt was made to use an object that is not, or is no longer, usable, После запуска dart2js с настройками по умолчанию его довольно сложно прочитать, и у меня возникли проблемы с отладкой вывода, поэтому я добавил эти параметры в свой pubspec.yaml:

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

Я ожидал, что что-то сломается, но я надеялся, что сообщение об ошибке будет достаточно ясным, чтобы я мог его решить, но я понимаю, какую ошибку я получаю.

Новая ошибка, которую я получаю:

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</<()

Похоже, у dart возникли проблемы с преобразованием замыкания в функцию js. Я бы подумал, что это будет сделано, когда dart2js запускается, а не во время работы приложения в браузере.

Мой код не имеет явных замыканий, но я использую async await, Прав ли я, предполагая, что они будут преобразованы в замыкания?

На всякий случай это актуально, я тоже использую Angular2.

Обновить

Похоже, что мои проблемы вызваны моим использованием HttpRequest.request() от dart:html,

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

print( res.status );

Если я уберу проверенный режим и соберу это, то получу An attempt was made to use an object that is not, or is no longer, usable ошибка.

3 ответа

Решение

Кажется, я решил проблему, изменив свое использование HttpRequest учебный класс.

От:

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

print( res.status );

Для того, чтобы:

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

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

Я не уверен, что было на самом деле проблема, но таким образом я не понимаю ни InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable или более длинная ошибка дротика:

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</<()

Я думаю, что dart2js есть некоторые проблемы с async await "неявные" замыкания, и я гораздо счастливее, когда я использую закрытое "явная функция, которая закрывает свою среду".

Спасибо Günter Zöchbauer за помощь.

API лучше, более интуитивно понятен. Например, ваш запрос:

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();

И вы, вероятно, могли бы видеть в параметрах, хотите ли вы большей точности определить способ запроса.

Вы должны использовать пакет http вместо

https://pub.dartlang.org/packages/http

Другие вопросы по тегам