Как я могу получить доступ к результату ответа HttpRequest в Dart?

После многих попыток получить содержимое ответа в HttpRequest, мне совершенно не удалось узнать или понять, почему я не могу получить то, что хочу, и я должен упомянуть, что я могу регистрировать и манипулировать ответом только внутри onReadyStateChange (onLoad и onLoadEnd дают мне те же результаты!), но я действительно хочу, чтобы это значение было вне обратного вызова.

Вот часть кода, с которой я застрял

Map responsData;
req=new HttpRequest()
            ..open(method,url)
            ..send(infojson);

req.onReadyStateChange.listen((ProgressEvent e){

  if (req.readyState == HttpRequest.DONE ){

    if(req.status == 200){

      responsData = {'data': req.responseText};
      print("data receaved: ${ req.responseText}");
      //will log {"data":mydata}

    }
    if(req.status == 0){

      responsData = {'data':'No server'};
      print(responsData );
      //will log {"data":No server}

    }  
  }
});
//anything here to get responsData won't work

person Saïd Tahali    schedule 03.11.2013    source источник


Ответы (1)


Вы должны назначить обратный вызов onLoad перед вызовом send. Я не уверен, что вы имеете в виду только внутри onReadyStateChange. Возможно, вы хотите присвоить responseText переменной вне обратного вызова.

Создайте метод:

Future<String> send(String method, String url, String infojson) {
  var completer = new Completer<String>();
  // var result;
  req=new HttpRequest()
        ..open(method,url)
        ..onLoad.listen((event) {
          //print('Request complete ${event.target.reponseText}'))
          // result = event.target.responseText;
          completer.complete(event.target.responseText);
        })
        ..send(infojson);
  return completer.future;
}

и вызовите этот метод как

var result;
send(method, url).then(
  (e) {
    // result = e;
    print('Request complete ${e}'));
  });
person Günter Zöchbauer    schedule 03.11.2013
comment
да, я хочу назначить ответ переменной вне обратного вызова, чтобы отправить данные за пределы класса, хорошо, я попробую это решение и скоро дам вам отзыв, спасибо за помощь, это много значило! - person Saïd Tahali; 04.11.2013
comment
Я попробовал ваше решение, оно хорошее, но все же не то, что мне нужно, оно только дает блоку обратного вызова возможность использовать его в других классах, но не позволяет получить значение ответа за его пределами! пожалуйста, если я неправильно понимаю, что вы там сделали, дайте мне знать! - person Saïd Tahali; 04.11.2013
comment
Мне трудно понять, что ты хочешь сделать. Я добавил закомментированные строки, возможно, это то, что вы хотите. Методы обратного вызова являются замыканиями. Вы можете получить доступ к переменным вне метода, как в закомментированных строках. Вы можете сделать это без завершения/будущего в обратном вызове onLoad() или в обратном вызове then(). - person Günter Zöchbauer; 04.11.2013
comment
после исследования я обнаружил, что невозможно присвоить текст ответа переменной и использовать эту переменную из обратного вызова! я думаю, что повторю работу, которую я сделал, и на этот раз я буду обрабатывать данные, которые я получаю внутри обратного вызова. спасибо за вашу помощь и ваше время и будьте уверены, что ваша идея мне очень помогла! - person Saïd Tahali; 04.11.2013