异步编程之Promise

一、Promise

1. .then 和.catch

· resolved 状态的Promise 会回调后面的第一个.then
· rejected 状态的Promise 会回调后面的第一个.catch
任何一个rejected 状态且后面没有.catch 的Promise,都会造成浏览器/node 环境
的全局错误
/**
 * promise的状态转换以及通过then获取内容
 */
const promise = new Promise((resolve, reject) => {
    setTimeout(function () {
        resolve(3);
        // reject(new Error(4))
    }, 500)
})

promise
    .then(function (result) {
        console.log(result)
    })
// .catch(function (err) {

// })

setTimeout(() => {
    console.log(promise)
}, 800)

2.执行then 和catch 会返回一个新Promise,该Promise 最终状态根据then 和catch 的回调函数的执行结果决定

· 如果回调函数最终是throw,该Promise 是rejected 状态
· 如果回调函数最终是return,该Promise 是resolved 状态
/**
 * promise的链式调用
 */

interview(1)
    .then(()=> {
        return interview(2);
    })
    .then(()=> {
        return interview(3);
    })
    .then(()=> {
        if (Math.random() > 0.1) {
            const error = new Error('keyboard')
            error.round = 'keyboard'
            throw error
        }
    })
    .catch((err)=> {
        console.log('cry at ' + err.round)
    })

function interview(round) {
    return new Promise((resolve, reject) => {
        setTimeout(()=> {
            if (Math.random() < 0.2) {
                const error = new Error('failed');
                error.round = round;
                reject(error);

            } else {
                resolve('success');
            }
        }, 500)
    })
}

3.Promise.all

/**
 * Promise的最后一个例子,把前面的例子都整合进来了
 * 进行三轮面试,都通过之后征求所有家庭成员的同意
 * 只要有一处不通过则面试失败
 * 通过Promise.all完成异步并行任务
 */

interview(1)
    .then(() => {
        return interview(2);
    })
    .then(() => {
        return interview(3);
    })
    .then(() => {
        return Promise.all([
            family('father').catch(() => { /* 忽略老爸的的反对意见 */ }),
            family('mother'),
            family('wife'),

        ]).catch(e => {
            e.round = 'family'
            throw e;
        })
    })
    .then(() => {
        console.log('success');
    })
    .catch((err) => {
        console.log('cry at ' + err.round)
    })

function interview(round) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() < 0.2) {
                const error = new Error('failed');
                error.round = round;
                reject(error);

            } else {
                resolve('success');
            }
        }, 500)
    })
}
function family(name) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() < 0.2) {
                const error = new Error('disagree');
                error.name = name;
                reject(error);

            } else {
                resolve('agree');
            }
        }, Math.random() * 400)
    })
}
(0)

相关推荐

  • promise的常用情况

    因为js是单线程的,所以一旦代码中有报错,就不会执行下面的了,如下333就未打印 console.log(111) throw Error(222) console.log(333) 好像与promi ...

  • 20分钟带你掌握JavaScript Promise和 Async/Await

    一般在开发中,查询网络API操作时往往是比较耗时的,这意味着可能需要一段时间的等待才能获得响应.因此,为了避免程序在请求时无响应的情况,异步编程就成为了开发人员的一项基本技能. 在JavaScript ...

  • Promise从入门到放弃

    Promise的理解与使用 Promise的理解 Promise是什么 抽象的表达就是:Promise 是异步编程的一种解决方案. 而具体点的表达就是: 在语法上:Promise 是一个构造函数: 在 ...

  • ES6语法之异步编程-Promise

    Promise 分解异步操作,避免回调地狱 //1.promise //分解异步操作,避免回调地狱 function testMise(value) { //resolve成功后回调 //reject ...

  • ES6---Promise 4: 更多案例

    ES6---Promise 4: 更多案例

  • 关于javascript中的promise的用法和注意事项

    一.promise描述 promise是javascript中标准的内置对象,用于表示一个异步操作的最终状态(是失败还是成功完成)及其结果值.它让你能够把异步操作最终成功或者失败的原因和响应的处理程序 ...

  • ES6---async, await, promise 综合例子

    ES6---async, await, promise 综合例子 new Promise(主线程代码).then(成功微任务, 失败微任务); sync---替代promise await---替代t ...

  • Promis.then()

    Promis.then()

  • 13.Promise

    Promise介绍 Promise是ES6引入的异步编程的新解决方案.语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果. Promise构造函数:Promise(exc ...

  • 原以为很简单,结果这道 Promise 面试题让我失眠好一会

    来自:掘金,作者:ITEM 链接:https://juejin.cn/post/6945319439772434469 先把罪魁祸首挂在这里给大家群殴