美文网首页
回调地狱问题

回调地狱问题

作者: 双鱼子曰1987 | 来源:发表于2021-12-21 11:26 被阅读0次

一、什么是回调地狱(Callback Hell)?

“回调地域”指的是,多级的异步的嵌套调用的问题。

举个例子:1、用户先登录 ,登录成功后会获得用户ID ---> 2、然后通过用户ID,再去请求用户个人信息,获取到用户个人信息后 ---> 3、为了使用方便,我们需要将其缓存在本地文件系统。 ---> 4、保存成功后,显示主页面逻辑

// 1 先分别定义各个异步任务
Future<String> login(String userName, String pwd){
    ...
    //用户登录
};
Future<String> getUserInfo(String id){
    ...
    //获取用户信息 
};
Future saveUserInfo(String userInfo){
    ...
    // 保存用户信息 
}; 

// 1、登录
login("alice","******").then((id){
 // 2、获取用户信息    
 getUserInfo(id).then((userInfo){
    // 3、保存用户信息
    saveUserInfo(userInfo).then((){
       // 4、显示主页面逻辑
       showMainPageView();
    });
  });
})

看到上面的例子,做过客户端开发的并不陌生,其本质是短时间内存在多种业务逻辑,业务逻辑之间有存在一定的先后顺序。特别是现在服务端讲究微服务治理,将服务进行划分细化到不同的服务器中,这样原来一个接口 可能变成 多个串行的接口调用。

二、Dart 如何解决回调地域呢?

1、链式编程解决和消除Callback Hell

利用链式编程的调用特点,可以很容易的将 内部的嵌套调用 剥离到 顶层,然后通过点.操作符进行链接。

  • 下面是 Future异步框架的解决方案
    由于Future所有的接口都会返回Future对象,可以简单的利用链式编程可解决嵌套问题。
// 1、登录
login("alice","******").then((id){ 
         // 2、获取用户信息
    return getUserInfo(id);
}).then((userInfo){
    // 3、保存用户信息
    return saveUserInfo(userInfo);
}).then((e){
   // 4、显示主页面逻辑
  showMainPageView();
}).catchError((e){
  // 4、错误处理  
  print(e);
});

3、消除 callback hell

  • 利用
task() async {
   try{
    // 1、登录
    String id = await login("alice","******");
    // 2、获取用户信息
    String userInfo = await getUserInfo(id);
    // 3、保存用户信息
    await saveUserInfo(userInfo);
    // 4、显示主页面
    showMainPageView();
   } catch(e){
    // 4、错误处理   
    print(e);   
   }  
}

和Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。

  Stream.fromFutures([
    Future.delayed(Duration(seconds: 1), (){
      return 'result 1';
    }),
    Future.delayed(Duration(seconds: 2), (){
      throw AssertionError('sorry!');
    }),
    Future.delayed(Duration(seconds: 3), (){
      return 'result 2';
    })
  ]).listen((event) {
    print('listen: $event');
  }, onError: (e){
    print('err: $e');
  }, onDone: (){
    print('finish!');
  });

// 打印
listen: result 1
err: Assertion failed: "sorry!"
listen: result 2
finish!

相关文章

  • 使用$.when实现异步调用的链式写法

    解决回调地狱的问题

  • 回调地狱问题

    使用promise(es6中api)来解决回调地狱的问题。promise1、promise本身不是异步任务但是内部...

  • 回调地狱问题

    一、什么是回调地狱(Callback Hell)? “回调地域”指的是,多级的异步的嵌套调用的问题。 举个例子:1...

  • 10 ES6 优化回调地狱、promise化、async+awa

    ES6 Promise可解决回调地狱、try{}catch{}、同步并发的异步问题,但解决回调地狱问题中依旧有很明...

  • promise

    原文地址https://www.jianshu.com/p/fe5f173276bd是解决回调地狱的问题回调地狱当...

  • 04-Node 异步编程

    Node 异步编程同步方法和异步方法异步 API 的执行顺序异步编程回调地狱问题Promise 改造回调地狱代码a...

  • promise和async

    Promise 回调地狱 Promise概念 Promise是ES6中新增的一个构造函数。 目的解决回调地狱的问题...

  • 异步相关

    一:同步异步XmlHttpRequest: Ajax原理: a->b->c地狱回调问题: Promise解决回调地...

  • Promise

    1.为什么需要Promise 回调地狱回调函数中嵌套回调Promise解决了回调地狱 2. Promise 的基本...

  • Promise

    什么是回调地狱 多层回调函数的相互嵌套,就形成了回调地狱 回调地狱的缺点: 代码耦合性太强,牵一发而动全身,难以维...

网友评论

      本文标题:回调地狱问题

      本文链接:https://www.haomeiwen.com/subject/mwlpfrtx.html