从异步概念到callback回调函数到promise

异步概念

javascript语言的执行环境的'单线程'的.javascript

所谓'单线程',就是指一次只能完成一件任务。若是有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。java

(实际上我认为计算机从微观上讲都是单线程的,由于一台机器在同一时间只能作一件事情。然而从宏观上讲,在咱们人的对时间的感知范围内,认为机器能够在一个时间作多个事情。这就是咱们感知的异步/多线程/并发。本质上机器运算也是按照前后顺序来的,这也就为何会有微积分等这样的学科来研究事物的本质了。)es6

概念这东西是人对事物认知的抽象描述,便于人们知识传递。而要理解好概念则要对引出这个概念的事物本质有所了解。ajax

同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;编程

异步任务:不进入主线程,而进入任务队列中的任务,只有任务队列通知主线程,某个异步任务能够执行了,这个任务才会进入主线程执行。promise

事件循环(Event Loop):只有执行栈中的全部同步任务都执行完毕,系统才会读取任务队列,看看里面的异步任务哪些能够执行,而后那些对应的异步任务,结束等待状态,进入执行栈,开始执行。bash

最简单的异步-callback

// 例1
function foo(callback){//定义函数的时候将另外一个函数(回调函数)做为参数传入定义的函数中。
    $ajax({
        //...
        success:callback//异步操做执行完毕后,再执行该回调函数,确保回调在异步操做以后执行。
    })
}
function myCallback(result){
    //...
}
foo(myCallback) // 回调函数自己是咱们约定俗成的一种叫法,咱们定义它,可是并不会本身去执行它,它最终被其余人执行了。

// 例2
function f1(callback){
    setTimeout(function () {
        // f1的任务代码
        callback()
    }, 1000)
}
f1(f2)
复制代码

优势:比较容易理解; 缺点:1.高耦合,维护困难,回调地狱;2.每一个任务只能指定一个回调函数;3.若是几个异步操做之间并无顺序之分,一样也要等待上一个操做执行结束再进行下一个操做。多线程

promise

Promise是抽象异步处理对象以及对其进行各类操做的组件。并发

Promise并非从JavaScript中发祥的概念。Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言异步

JavaScript的异步处理,最简单的是利用回调函数,而Promise则是把相似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写。

建立promise

1. new Promise(fn) 返回一个promise对象

2. 在fn 中指定异步等处理

    2.1. 处理结果正常的话,调用resolve(处理结果值)

    2.2. 处理结果错误的话,调用reject(Error对象)
复制代码
const promise = new Promise(function(resolve, reject) { // 不要问为何写resolve和reject,这是promise封装的规定,好比你封装一个函数也得按照你的规定传参
  // ... some code

  if (/* 异步操做成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
复制代码

Promise构造函数接受一个函数做为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用本身部署。

resolve函数的做用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去。

reject函数的做用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去。

Promise实例生成之后,能够用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});
复制代码

then方法能够接受两个回调函数做为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不必定要提供。这两个函数都接受Promise对象传出的值做为参数。

promise刚开始用的时候要理解这些概念,而咱们又不知道它内部的封装实现,因此都会有十万个为何,然而封装的好处就是咱们能够不用理解内部实现,只要按照规定规则规范去使用它就能获得想要的结果。promise就是封装好的异步操做对象,咱们可使用它实现各类异步功能。

想要查看更多的promise使用请看 es6.ruanyifeng.com/#docs/promi…

想要了解更多的promise知识请看 liubin.org/promises-bo…

相关文章
相关标签/搜索