Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Dart中向服务器发出多个独立请求的最佳方法_Dart_Flutter_Dart Http - Fatal编程技术网

在Dart中向服务器发出多个独立请求的最佳方法

在Dart中向服务器发出多个独立请求的最佳方法,dart,flutter,dart-http,Dart,Flutter,Dart Http,我希望以最佳方式向同一服务器发出多个请求。所以我有 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) {

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

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;
}
Future getAllItems()异步{
var client=newhttp.client();
列表项SID=['1','2','3'];//不同的ID
列表项列表=[];
用于(项目SID中的var项目){
//调用服务器,例如:“sampleapi/1/next”等
等待client.get('sampleapi/'+item+'/next')。然后((响应){
//进行一些处理并添加到itemList
});
}
client.close();
返回项目列表;
}

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

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

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 
      });
    );
}
Future getAllItems()异步{
var client=newhttp.client();
列表项SID=['1','2','3'];//不同的ID
返回未来。等待(['1','2','3'])。映射((项)=>
get('sampleapi/'+item+'/next')。然后((响应){
//进行一些处理并添加到itemList
return foo;//此请求的结果的某些项
});
);
}

另请参见

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();
}
Future getAllItems()异步{
var client=new client();
列表项SID=['1','2','3'];//不同的ID
List List=wait Future.wait(itemsIds.map((itemId)=>client.get('sampleapi/$itemId/next'));
返回list.map((响应){
//在此进行处理并返回项目
返回新项目();
}).toList();
}

我正在使用不同的未来方法对同一服务器进行多次调用,但它返回空的主体id。我确保单个http调用正常工作不确定。也许您希望只有在前一个请求完成后才能发出一个请求。它们是同时发出的。如果一个请求依赖于之前要完成的另一个请求,那么这将不起作用k、 如果你的情况不是这样,我不知道是什么原因造成的。让我试试上面的解决方案,希望它能奏效,谢谢你的帮助reply@GünterZöchbauer可以使用SQLite将这3个API数据存储在本地3个数据库表中?不知道您的意思是什么“这是3个API”,当然,为什么不呢?可以使用SQLite将这3个API数据存储在本地3个数据库表上吗?