【问题标题】:Optimal way to make multiple independent requests to server in Dart在 Dart 中向服务器发出多个独立请求的最佳方式
【发布时间】:2018-04-25 16:57:57
【问题描述】:

我想以最佳方式向同一服务器发出多个请求。所以我有

Future<List<Item>> getAllItems() async {
    var client = new http.Client();
    List<String> itemsIds = ['1', '2', '3']; //different ids
    List<Item> itemList = [];
    for (var item in itemsIds) {
      //make call to server eg: 'sampleapi/1/next' etc
      await client.get('sampleapi/' + item + '/next').then((response) {
        //Do some processing and add to itemList

      });
    }
    client.close();
    return itemList;
}

现在,api 调用一个接一个。但是 api 调用是相互独立的。避免异步等待地狱的最佳实施方式是什么?

【问题讨论】:

    标签: dart flutter dart-http


    【解决方案1】:

    您可以使用Future.wait(...) 等待一组Futures 完成:

    Future<List<Item>> getAllItems() async {
        var client = new http.Client();
        List<String> itemsIds = ['1', '2', '3']; //different ids
    
        return Future.wait<Item>(['1', '2', '3'].map((item) =>
          client.get('sampleapi/' + item + '/next').then((response) {
            //Do some processing and add to itemList
            return foo; // some Item that is the result of this request 
          });
        );
    }
    

    另见https://api.dartlang.org/stable/1.24.3/dart-async/Future/wait.html

    【讨论】:

    • 我正在使用不同的未来方法对同一服务器进行多次调用,但它返回给我空的 body id 我进行单个 http 调用它工作正常
    • 不确定。也许您希望仅在前一个请求完成后才提出一个请求。它们是同时制作的。如果一个请求依赖于另一个之前完成的请求,这将不起作用。如果您的情况不是这种情况,我不知道是什么原因造成的。
    • 让我试试上面的解决方案希望它会起作用并感谢您的回复
    • @GünterZöchbauer 可以使用 SQLite 将这 3 个 API 数据存储在本地 3 个表 DB 上吗?
    • 不确定“这 3 个 API”是什么意思,但可以确定,为什么不呢?
    【解决方案2】:

    Günter 比我早了几分钟,但我已经把它打出来了,所以这里有一个小替代方案,它也可以工作,并且完全避免使用 'then'。

    Future<List<Item>> getAllItems() async {
      var client = new Client();
      List<String> itemsIds = ['1', '2', '3']; //different ids
    
      List<Response> list = await Future.wait(itemsIds.map((itemId) => client.get('sampleapi/$itemId/next')));
    
      return list.map((response){
        // do processing here and return items
        return new Item();
      }).toList();
    }
    

    【讨论】:

    • 可以使用 SQLite 将这 3 个 API 数据存储在本地 3 个表 DB 上吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多