Flutter 异步

业务流程:请求用户个人信息,获取到用户个人信息后,为了使用方便,我们需要将其缓存在本地

Future<String> login(String userName,String password){

    //... 用户登录

}

Future<String> getUserInfo(String id){

    //... 获取用户信息

}

Future saveUserInfo(String userInfo){    

    //...保存用户信息

}

实现业务流程 Future版

login('zhangsan','*****').then((id){

    return getUserInfo(id);

}).then((userInfo){

    return saveUserInfo(userInfo)

}).then((e){

    //...

}).catchError((e){

    //错误处理

}).whenComplete((e){

    //无论成功或失败都会走到这里

})

实现业务流程 async/await版

task() async {

    try{

        String id= awiat login('zhangsan','******');

    String userInfo = await getUserInfo(id);

    await saveUserInfo(userInfo);

    //执行接下来的操作

    }catch(e){

        //错误处理

    }

}

业务场景:等待多个异步任务都执行结束后才进行一些操作,比如我们有一个界面,需要先分别从两个网络接口获取数据,获取成功后,我们需要将两个接口数据进行特定的处理后再显示到UI界面上

Future.wait([

    //模拟请求1

    Future.delayed(new Duration(seconds:4),(){

        return 'world';

},

    //模拟请求2

    Future.delayed(new Duration(seconds:2),(){

        return 'hello';

    }

]).then((results){

    print(results[0]+results[1]); //输出 hello world

}).catchError((e){

    //处理错误

}).whenComplete((e){

    //无论成功或失败都会走到这里

});

业务场景:在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等

Stream.fromFutrues([

    Future.delayed(new Duration(seconds:1),(){ return "hello 1"}),

    Future.delayed(new Duration(seconds:4),(){ throw AssertionError("Error")}),

    Future.delayed(new Duration(seconds:2),(){ return "hello 3"}),

]).listen((data){

    print(data);

},onError:(e){

    print(e.message)

},onDone:(){  //可选命名参

    //

})

依次输出 hello1 

               hello 2

               Error

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。