美文网首页
Javascript处理异步的三种方式

Javascript处理异步的三种方式

作者: 西麦smile | 来源:发表于2018-11-25 16:37 被阅读11次

callback

function ajax(fn) {
    setTimeout(() => {
        console.log('你好')
        fn()
    }, 1000)
}

// callback 回调地狱
ajax(() => {
    ajax(() => {
        ajax(() => {
            console.log('执行结束3')
        })
        console.log('执行结束2')
    })
    console.log('执行结束1')
})

执行结果:

你好
执行结束1
你好
执行结束2
你好
执行结束3

Promise

function delay(word) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('hello: ' + word)
        }, 1000)
    })
}

delay('name1')
    .then((word) => {
        console.log(word)   // hello name1
        return delay('name2')
    })
    .then((word) => {
        console.log(word)   // hello name2
        return delay('name3')
    })
    .then((word) => {
        console.log(word)   // hello name3
    })

执行结果:

hello: name1
hello: name2
hello: name3

async/await

function delay(word1) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('hello: ' + word1)
        }, 1000);
    })
}

// async + await 一起使用
// await 必须在 async 内部使用
// await 等待异步执行结束,这样看起来就像同步的形式
// await 就是等待的意思
async function start() {
    // 等待 delay('孙悟空') 结束
    const word1 = await delay('孙悟空')
    console.log(word1)
    // 等待 delay('猪八戒') 结束
    const word2 = await delay('猪八戒')
    console.log(word2)
    // 等待 delay1('沙悟净') 结束
    const word3 = await delay('沙悟净')
    console.log(word3)
}
start()

输出结果:

hello: 孙悟空
hello: 猪八戒
hello: 沙悟净

async/await 简介

async 函数实际上是 Generator 函数的语法糖,表示内部有异步操作

async 函数返回一个 Promise 对象,可以使用 then 添加回调函数,如下代码所示:

async function delay() {
    return 'hello world'
}

delay().then((value) => {
    console.log(value)  // hello world
})

await 命令后面是一个 Promise 对象,如果不是,会被转化为一个立即 resolve 的 Promise 对象,如下代码所示:

async function delay() {
    return await 123
}

delay().then(value => {
    console.log(value)  // 123
})

await 后面的 Promise 如果变成 reject 状态,reject 会被 catch() 的回调捕捉到,如下代码所示:

注意: 即使 await 前面没有 return,reject 的参数也一样可以传入catch() 中,即使加上 return 结果也是一样的。

async function delay() {
    await Promise.reject('error')
}

delay().then(value => {
    console.log(value)
}).catch(error => {
    console.log(error)  // error
})

如果 async 函数中的 await 的异步处理操作发生错误,那么 async 返回的 Promise 对象也一样被 reject,如下代码所示:

async function delay() {
    await new Promise((resolve, reject) => {
        reject('error')
    })
}

delay()
    .then((value) => console.log(value))
    .catch((error) => console.log(error))   // error

由于 await 后面是 Promise 对象,因此有可能会 rejeceted,因此最好把 await 放在 try...catch 代码块中,如下代码所示:

async function delay() {
    await maybeReturnAPromise()
    .catch((error) => {
        console.log(error)
    })
}

function maybeReturnAPromise() {
    return Promise.reject('error')
}

delay()
    .then(value => console.log(value))  // error
    .catch(error => console.log(error)) // undefined

多个 await,如果不存在继发关系,则让他们同时触发,如下代码所示:

// 方法 1
let [foo, bar] = Promise.all([getFoo(), getBar()])

// 方法 2
let fooPromise = getFoo()
let barPromise = getBar()
let foo = await fooPromise
let bar = await barPromise

from:2018-06-01 11:20:03

相关文章

  • Javascript处理异步的三种方式

    callback 执行结果: Promise 执行结果: async/await 输出结果: async/awai...

  • Python异步方式浅析-中断子线程及任务

    情景   在开发中,我们处理耗时任务时,通常考虑使用异步处理 实现方式   一般我们实现异步的方式有三种,分别如下...

  • ES6 之 Promise

    Promise是JavaScript异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步...

  • Angular笔记--HTTP

    Angular有自己的HTTP库,可以用来调用外部的API,请求方式是异步请求。在Javascript中有三种方式...

  • 深入理解 promise:promise的三种状态与链式调用

    promise出现的目的一为处理JavaScript里的异步,再就是避免回调地狱。 一、promise的三种状态和...

  • Ajax笔记

    Ajax(Asynchronous JavaScript and XML ): JavaScript通过异步的方式...

  • ES6(7)之Async和await

    先谈JavaScript的异步处理 JavaScript是一门单线程的编程语言,如果不设计异步处理的机制,很容易因...

  • 异步处理举例

    类比Java Web中的Servlet异步处理类比JavaScript中的Ajax异步处理类比WebSocket中...

  • javascript异步流程处理几种方式

    前言JavaScript 提倡书写异步方法, 这样可以更好地利用事件队列机制, 来高效的无阻塞的运行应用。但这容易...

  • Dva异步的同步处理

    dva action一般是异步的,但是业务有时需要同步处理,总结三种处理方式如下: async处理函数 利用@@e...

网友评论

      本文标题:Javascript处理异步的三种方式

      本文链接:https://www.haomeiwen.com/subject/cgwpqqtx.html