prmoise,async和await,同步与异步的理解

异步的意义:

同步与异步:

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

2.异步任务:不进入主线程,任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,这个任务才会进入主线程执行。

js为单线程执行,同步的写法导致如果执行中有一个任务耗时较长,js就会一直等待该任务直到返回结果后才会继续向下执行。这样就造成了代码执行阻塞的问题。于是有异步的方式可以让某些任务进入到一个异步队列中,暂时让主进程跳过该任务继续向下执行。

异步的解决:

在异步中,如果需要前一个任务的结果作为下一个任务的参数执行,就需要在前一个任务的类似success()中继续写下一个人物的代码,造成嵌套层级过多的回调地狱。于是使用promise可以解决这个问题,例如链式操作的then(),catch(),但如果多个promise同时处理还是会写出类似回调地狱的写法。而搭配async和await可以达到用同步的方法处理异步。

关于promise.then()返回的新promise的结果状态由什么决定?

  .then()方法里接收两个函数作为参数,分别是resolve和jeject后执行的回调。返回的一个新的promise实例。相当于then方法是两个实际的回调函数,第一个回调函数是定义promise执行成功时resolve括号里的数据,这样就可以异步拿到数据了。第二个回调函数是定义promise执行失败时reject括号里的数据。

  1.return值的情况

    function test(){
    const promise = new Promise((resolve,reject)=> {
      setTimeout(function(){
              resolve('执行成功')
      },1000)
        })
        return promise;
    }
    test().then(aData =>{
    console.log('aData',aData)
    return '9'
    }).then(bData =>{
    console.log('bData',bData)
    })
    输出结果是:
    aData 执行成功
    bData 9

    当不写return 9时,第二行输出为undefined

  2.throw error

  返回得promise会成为rejected的状态,下一步执行catch中的回调函数或者then的第二个回调函数参数。

  3.返回一个新promise,此promise的结果就会成为新promise的结果

ps:promise.all()方法:

Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。

var p = Promise.all([p1,p2,p3]);

上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。(Promise.all方法的参数不一定是数组,但是必须具有iterator接口,且返回的每个成员都是Promise实例。)

p的状态由p1、p2、p3决定,分成两种情况。

只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

  promise.rase()方法:

Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。

var p = Promise.race([p1,p2,p3]);
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。

如果Promise.all方法和Promise.race方法的参数,不是Promise实例,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。

 

async,await的概念和意义:

于是有了async和await,async的函数中可以有一个或多个异步操作,一旦遇到await就会返回一个pending等待状态的promise对象,暂时返回了执行代码的控制权。使得函数外的代码得以继续执行。这是保证非阻塞的部分。等await后的异步请求resolve或reject,主线程才会继续执行async函数内后面的部分。async函数内部异步代码就像被同步执行一样,而不是阻塞主线程知道异步调用返回。

一句话概括:async函数内阻塞,函数外不阻塞。

 

 

async:作为关键字写在函数前,代表改函数为异步函数,不会阻塞后续的进行。函数会返回一个promise对象,用then()获取其中的值,如果函数内部抛出错误,有一个catch()方法进行捕获。

await“:等待一个返回值,常量变量函数promise等,

为什么await只能配合async中使用?

await等的是一个返回结果,如果是同步状态,即直接返回了,如果是异步,await会阻塞接下来的流程,直到返回结果,而async会被包裹在一个promise中执行,所以await只能在async中使用,否则阻塞正常进程。

资料:https://www.zhihu.com/question/62254462

posted on 2022-02-15 11:57  SE7EN_96  阅读(1712)  评论(1编辑  收藏  举报

导航