美文网首页
js处理异步问题的方式

js处理异步问题的方式

作者: 海豚先生的博客 | 来源:发表于2020-06-17 08:20 被阅读0次

    回调函数

    function f1(callback) {
      setTimeout(function () {
        // f1的任务代码
    
        callback();
      }, 1000);
    }
    f1(f2)
    高度耦合
    

    事件监听

    f1.on('done', f2);
    function f1() {
      setTimeout(function () {
        // f1的任务代码
    
        f1.trigger("done");
      }, 1000);
    }
    

    发布/订阅

    • 我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。
    jQuery.subscribe("done", f2);
    function f1() {
      setTimeout(function () {
        // f1的任务代码
    
        jQuery.publish("done");
      }, 1000);
    }
    
    • 这种方法的性质与"事件监听"类似,但是明显优于后者。因为我们可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

    Promise对象

    f1().then(f2).then(f3);

    promise中链式编程

    let p = new Promise((resolve,reject) => {
      setTimeout(() => {
        resolve('111')
      }, 1000);
    })
    
    p.then(res => {
      console.log('这个是111=',res)
      function f1(resolve,reject) {
        // 异步操作,请求接口
        setTimeout(res => {
          resolve('222')
        },1000)
      }
      return new Promise(f1)
    }).then(res => {
      console.log('这个是222=',res)
      console.log('333')
    }).then(res => {
      console.log('444')
    })
    

    终极解决方案-async函数

    async function f() {
    // 防止出现错误方法一
      try {
        await getStockSymbol(name);
      } catch(e) {
    
      }
    await getStockPrice(symbol)
    .catch(err => {
      // 防止出现错误方法二
      console.log(err)
    })
      return await Promise.resolve('hello world');
    }
     
    f()
    .then(v => console.log(v))
    

    相关文章

      网友评论

          本文标题:js处理异步问题的方式

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