同步异步与asyns/promise的区别:

 

异步与同步:

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式,指后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。  

 

Promise 是在 j s 中进行异步编程的新解决方案。从语法上来讲,Promise是一个对象,从它可以获取异步操作的消息。

具体来说,Promise其实是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法。

而方法的使用和promise的状态也有很大关系,promise有三种状态:

pending: 初始状态,成功或失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。

调用resolve方法时,Promise的状态就变成fulfilled,即操作成功状态
调用reject方法后,Promise状态变为rejected,即操作失败状态,此时执行then方法里面onrejected操作
then方法里面有两个参数onfulfilled(Promise为fulfilled状态时执行) 和 onrejected(Promise为rejected状态时执行)
catch其实跟then方法中的第二个参数一样,就是在Promise状态为rejected时执行,then方法捕捉到Promise的状态为rejected,就执行catch方法里面的操作。

下面用一段代码进行展示:

复制代码
复制代码
var p = new Promise(function (resolve, reject) {
            var timer = setTimeout(function () {
                console.log('执行操作1');
                resolve('这是数据1');
            }, 1000);
        });
        p.then(function (data) {
            console.log(data);
            console.log('这是成功操作');
        });
复制代码
复制代码

下面是代码的效果图:

最后总结promise的优点与缺点:

优点:

(1)解决回调地狱问题 ,有时我们要进行一些相互间有依赖关系的异步操作,比如有多个请求,后一个的请求需要上一次请求的返回结果。

(2)更好地进行错误捕获

缺点:

(1)无法取消Promise,一旦新建它就会立即执行,无法中途取消。

(2)如果不设置回调函数,promise内部抛出的错误,不会反应到外部。

(3)当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

async:

async 是“异步”的简写, async 用于申明一个异步的 function。

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对

async函数可以直接then,返回值就是then方法传入的函数。async声明的函数的返回本质是一个Promise。

 

await:

await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),

且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

 

下面用代码进行展示:

复制代码
复制代码
function autoGentorat(genF) {
    // 返回一个promise,可以链式调用
    return new Promise(function(resolve, reject) {
        // 实例化实参(实参是传递过来的Generator),获得next方法
        let gen = genF();
        function step(result) {
            // Generator执行到最后,done是true,
            if (result.done) {
                resolve(result.value);
            } else {
                // 没执行完,使用promise的方式让其进行下一步
                // 因为 result你不知道是否是一个异步的操作,所以需要promise
                Promise.resolve(result.value).then(function(res) {
                    // 上一步等待执行结果完毕,进行下一步
                    step(gen.next(res));
                });
            }
        }
        // 开始执行generrator第一步
        step(gen.next(undefined));
    });
}

function getUserInfo(){
    return new Promise(function(resolve,relect){
        setTimeout(function(){
            resolve({name:'小刘鸭'})
        },2000)
    })
}

autoGentorat(function*() {
    yield 1;
    let data = yield getUserInfo();
})
复制代码
复制代码

最后总结,async/await与promise的区别:

1.Promise的出现解决了传统callback函数导致的“地狱回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。
2.async await与Promise一样,是非阻塞的。
3.async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

posted @ 2022-05-12 21:01  Heroes13  阅读(152)  评论(0)    收藏  举报