关键值未来任务队列

时间:2019-04-07 00:52:13

标签: asynchronous dart flutter queue

我想创建一个将来的任务队列,并使用一个密钥来避免将已经添加的相同任务添加到队列中。

这是我的情况:

  • 异步调用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 :(得分:0)

好吧,首先需要有一个具有url的urlArray,然后实现一个名为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)