SOURCE

function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, 'done');
    });
}

timeout(500).then((value) => {
    console.log(value)
});
//上面代码中,timeout方法返回一个Promise实例,表示一段时间以后才会发生结果.
//过了指定时间后(ms参数),Promise实例的状态变为Resolved,就会触发then
//方法绑定的回调函数.

//--------------Promise的执行顺序----------------//
let promise = new Promise((resolve, reject) => {
    console.log('Promise');
    resolve();
});

promise.then(() => {
    console.log('resolved');
})

console.log('Hi');
//-----------------Promise Ajax操作-------------//
const getJSON = function (url) {
    const promise = new Promise((resolve, reject) => {
        const handler = function () {
            if (this.readyState !== 4) {
                return;
            }
            if (this.status === 200) {
                resolve(this.response);
            } else {
                reject(new Error(this.statusText));
            }
        };

        const client = new XMLHttpRequest();
        client.open('GET', url);
        client.onreadystatechange = handler;
        client.responseType = "json";
        client.setRequestHeader("Accept", "application/json");
        client.send();
    });

    return promise;
}

getJSON("/posts.json").then(function (json) {
    console.log('Contents: ' + json);
}, function (error) {
    console.error('出错了', error);
});

//---------------2个Promise状态 传递------------------------//
const p1 = new Promise((resolve, reject) => {
    setTimeout(() => reject(new Error('fail')), 3000)
});

const p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(p1), 1000)
});

p2.then(result => console.log(result))
    .catch(error => console.log(error.toString()));

//上面代码中,p1是一个Promise 3秒之后变为rejected. p2的状态在1秒后改变.
//Resolve方法返回的是p1.由于p2返回的是另一个Promise.导致p2自己的状态无效了.
//由p1的状态决定p2的状态.所以,后面的then语句都变成了针对p1.又过了2秒
//p1变为rejected 导致触发catch方法指定的回调函数

//-------------then()函数-----------------//
const p3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('step 1');
    }, 1000);

})

p3.then((value) => {
    console.log(value);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('step 2');
        }, 1000)
        // setTimeout(()=>resolve('step 2'),1000);
    })
}).then(function (value1) {
    console.log(value1)
});
//-------------catch()函数---------------//
//catch 就是 then(null,reject)的别名
getJSON('/fake.json').catch(function (error) {
    console.log('error happen', error.toString())
})

const someAsyncThing = function () {
    return new Promise(function (resolve, reject) {
        resolve(y + 2);
    });
};

someAsyncThing().then(function () {
    console.log('everything is great');
}).catch(function (error) {
    console.log(error.toString())
});
//浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,
//但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。
//这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,
//通俗的说法就是“Promise 会吃掉错误”。

//-------------finally--------------//
const p5 = new Promise((resolve, reject) => {
    resolve(123);
})

p5
    .then(function (result) {
        console.log(result);
    })
    .finally(() => { console.log('finally') })
console 命令行工具 X clear

                    
>
console