美文网首页
Promise初体验

Promise初体验

作者: 临安linan | 来源:发表于2019-05-10 00:26 被阅读0次

    ES6中推出了一种新的异步编程的方案,可以解决回调嵌套过深(俗称回调地狱)导致阅读性差,难以维护的问题,如下:

    $.get(url, data1 => {
        console.log(data1)
        $.get(data1.url, data2 => {
            console.log(data1)
            $.get(data2.url, data3 => {
              console.log(data2)
              $.get(data3.url, data4 => {
                console.log(data3)
            })
          })
        })
    })
    

    先来简单介绍一下Promise:
    Promise对象是一个构造函数,用来生成Promise实例。同时接受一个函数作为参数,该函数的两个参数分别是resolve和reject(规定)。它们是两个函数,一个是成功后执行的回调,一个是失败后执行的回调。

    let promise = new Promise(function(resolve, reject) {
      // ...
      if (/* 异步操作成功 */){
        resolve(value);
      } else {
        reject(error);
      }
    });
    

    生成实例后,要用then方法分别指定resolved和rejected的回调函数。

    promise.then(
      () => { // 成功的回调函数 },
      () => { // 失败的回调函数 }
    )
    

    说到这里,依旧没有说到Promise怎么解决回调嵌套过深的问题,那么在Promise中是怎么在回调中套回调的呢?
    答案是:用 then 链式操作异步代码。

    我们在控制台输入这么一段代码

    let pro = new Promise(function(resolve, reject) {
      if (true){
        resolve('成功');
      } else {
        reject('失败');
      }
    }).then(
      (value) => { console.log(value) },
      (error) => { console.log(error) }
    )
    

    打印出pro,看看是什么

    image.png
    可以看到,promise对象在 then 之后,返回的还是一个promise对象。这也就是说,我们可以链式调用then了!(但是这个promise对象和原来那个promise对象不是同一个)

    让我们再"套一层"回调:
    let pro = new Promise(function(resolve, reject) {
      if (true){
        resolve('成功');
      } else {
        reject('失败');
      }
    }).then(
      (value) => { console.log(value); return '上一个then传来成功的消息'},  
    // 这里 return 的值会被传为下一个then的参数
      (error) => { console.log(error) }
    ).then(
        (value) => { console.log(value) }
    )
    

    以上,写了Promise的基本用法,用 Promise 来实现异步代码,可读性得到了增强,也更好维护了。

    相关文章

      网友评论

          本文标题:Promise初体验

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