очередь значений ключа будущих задач - PullRequest
0 голосов
/ 07 апреля 2019

Я хочу создать очередь будущих задач с ключом, чтобы избежать добавления в очередь той же задачи, что уже добавлена.

Это мой сценарий:

  • асинхронный вызов url1
  • асинхронный вызов url1
  • асинхронный вызов url2

Что мне нужно, это:

  • добавить вызов к url1 в очередь и выполнить его
  • НЕ добавляйте второй вызов url1 в очередь и не выбрасывайте его
  • добавить вызов в url2 в очередь, дождаться завершения вызова url1 и выполнить его

Я читал о StreamQueue и Queue, но не знаю, подходит ли он для моих нужд.

Другая структура, о которой я читал, - await for с потоком.

Итак, я попробовал что-то вроде:

await for (var url in stream) { // <--- I do not know how create this stream
  var url = Uri.https('www.example.com', url);

  List<dynamic> tmpItems;

  try {
    http.Response res = await http.get(url);
    final data = json.decode(res.body);
    tmpItems = _parseItems(data["data"]);
  } catch(e) {
    print(e);
  }

  if (this.mounted) {
    return setState(() {
      _items.addAll(tmpItems ?? []);
    });
  }
}

Я не знаю, как создать stream и добавить к нему вызов.

1 Ответ

0 голосов
/ 07 апреля 2019

хорошо, сначала вам нужно иметь urlArray с URL-адресами, затем реализовать асинхронный метод getUrl в качестве примера и реализовать его для получения данных из URL-адреса. Этот метод принимает URL-адрес в качестве параметра

Future getData(url,index) async {
       //here you can call the function and handle the output(return value) as result
       getUrl(url).then((result) {
           // print(result);
           //here check if index is smaller than the array length-1
           //if true then call getData function again to get next url
           if(index<urlArray.length)
           {
             --index;
             getData(urlArray[index],index);
            }
      });
 }

поэтому первый вызов будет примерно таким: getData (urlArray [0], 0)

...