Promise精解

207 阅读2分钟

我的第一篇文章!

一.什么用

同步程序按照我们书写代码的顺序一行一行地执行程序。

异步编程技术使程序启动一个可能长期运行的任务(IO 通常要比 CPU 慢上好几个数量级)并立即返回,从而继续对其他事件做出反应而不必等待任务完成;当操作最终完成时,通知我们操作的结果。

  • 异步朴素实现Callback

    回调函数是一个被传递到另一个函数中会在适当时候被调用的函数,曾经是 JavaScript 中实现异步函数的主要方式。当回调函数本身需要调用其他同样接受回调函数的函数时,基于回调的代码会变得难以理解。嵌套回调,处理错误也会变得非常困难:你必须在“金字塔”的每一级处理错误,而不是在最高一级一次完成错误处理。

fs.readFile(A, 'utf-8', function(err, data) {
    fs.readFile(B, 'utf-8', function(err, data) {
        fs.readFile(C, 'utf-8', function(err, data) {
            fs.readFile(D, 'utf-8', function(err, data) {
                //....
            });
        });
    });
});
  • 事件处理程序

    事件处理程序实际上就是异步编程的一种形式:你提供的函数(事件处理程序)将在事件发生时被调用(而不是立即被调用)。

document.querySelector('#reload')
.addEventListener('click', () => {
  log.textContent = '';
  document.location.reload();
});
  • 语法糖Promise

    Promise 是现代 JavaScript 异步编程的基础。它避免了深度嵌套回调,使表达和理解异步操作序列变得更加容易,并且它们还支持一种类似于同步编程中 try...catch 语句的错误处理方式。

const fetchPromise = fetch('https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json');

fetchPromise
  .then( response => {
    return response.json();
  })
  .then( json => {
    console.log(json[0].name);
  });

二. 怎么用

未命名文件 (8).png

每一个promise对象都会提供一个then方法或者是catch方法

somePromise().then(function () {
    // I'm inside a then() function!
});
somePromise().catch(function () {
    // I'm inside a catch() function!
});

在then或catch中有三种事可以做:

  1. 返回另一个promise;
  2. 返回一个同步值(或者undefined)
  3. 抛出一个同步错误。
getUserByName('zc')
.then(function (user) {
    if (user.isLoggedOut()) {
        // 抛出一个同步错误!
        throw new Error('user logged out!'); 
    }
    if (inMemoryCache[user.id]) {
        //返回一个同步值!
        return inMemoryCache[user.id]; 
    }
    // 返回另一个promise!
    return getUserAccountById(user.id); 
})
.then(function (userAccount) {
    // 处理userAccount!
})
.catch(function (err) {
    // 处理error!
});