一直搞不懂promise?

72 阅读2分钟

Promise

Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。

promise可以绑定在一个回调函数上,这样我们就不需要将回调函数作为参数传入这个函数 那么我们可以举个例子,来简单理解一下怎么来使用

//假设我们有Information(),接收一些配置和两个回调函数,然后异步返回信息。一个回调函数在文件成功创建时被调用,另一个则在出现异常时被调用。
// 成功的回调函数
function successCallback(result) {
  console.log("信息发送成功:" + result);
}

// 失败的回调函数
function failureCallback(error) {
  console.log("信息发送失败:" + error);
}
//函数将返回三个值
Information(someting,successCallback,failCallback)

我们升级一下使用.then方法重写为Promise

//声明一个Promise并赋值
const promise = Information(someting)
promise.then(successCallback,failCallback)

使用.then()优点:

  1. 在本次循环完成之前,回调函数不会被调用

  2. 即使异步操作已经完成(成功或失败),在这之后通过 [then()]添加的回调函数也会被调用

  3. 通过多次调用[then()]可以添加多个回调函数

异步操作

新手,在日常使用中如果想进行异步操作,就非常容易造成回调地狱:

  sayhello("one", function () {
    sayhello("two", function () {
      sayhello("three", function () {
        console.log("end");
      });
    });
  });

那么该怎么办呢?----->[链式调用]可以解决这个问题

链式调用

连续执行两个或者多个异步操作是一个常见的需求,在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。我们可以通过创造一个 Promise 链来实现这种需求。

then()函数返回的的是与之前不同的一个新的promise

const promise = someting()
const promise2 = promise.then(successCallback, failureCallback);

我们可以把回调函数绑定到promise上,形成一个promise链:

typeScript("one.js")
.then(script1 => {
  typeScript("two.js")
  .then(script2 => {
    typeScript("three.js")
    .then(script3 => {
      one();
      two();
      three();
    });
  });
});

在这里,我们使用箭头函数来重写

typeScript("one.js")
  .then(function(script) {
    return typeScript("two.js");
  })
  .then(function(script) {
    return typeScript("three.js");
  })
  .then(function (script) {
    one();
    two();
    three();
  });

这样看,是不是箭头函数写起来更简洁结合方便一些 好了,我们来写一个简单的promise实例:


// 假设结果为真
const isTrue = true;

const promise = new Promise((resolve, reject) => {
    // 进行判断
    if (isTrue) {
        resolve('成功')
    } else {
        reject('失败')
    }
})

promise
    // 获取成功
    .then(s => {
        console.log(`这个函数已经被调用${s}`)
    })
    // 获取失败
    .catch(e => {
        console.log(`这个函数未被调用${e}`)
    })
    //无论返回的结果是什么,都会返回这个
    .finally(y=>{
        console.log(`这是另外的价钱`)
    })

将会返回:

屏幕截图 2022-10-20 143233.png

通常我们使用promise,只需要调用一次,提当抛出异常时,浏览器就会顺着找到失败的[.Catch]函数、回调函数。如果想更加深入一点了解promise那么就直接点击下面链接 [](Promise - JavaScript | MDN (mozilla.org))

参考资料来自

MDN