new Promise

Author Avatar ZTFtrue 发表于 • 2018年05月04日 18:05 • 共 • 408 • 次浏览
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    // reject 失败
    // resolve 成功
    // Promise 实例
    /* Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject */
    // 它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
    const promise = new Promise(function (resolve, reject) {
        if (getId()/* 异步操作成功 */) {
            resolve(value);
        } else {
            reject(error);
        }
    });

    function getId() {

    }
    promise.then(function(value) {
        // success
    }, function(error) {
        // failure
    });


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

    timeout(100).then((value) => {
        console.log(value);
    });
</script>
</body>
</html>
// https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345008539155e93fc16046d4bb7854943814c4f9dc2000

function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    console.log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            console.log('call resolve()...');
            resolve('200 OK');
        } else {
            console.log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');// reject失败
        }
    }, timeOut * 1000);
}

var p1 = new Promise(test).then(function (result) {
    console.log('成功:' + result);
}).catch(function (reason) {
    console.log('失败:' + reason);
});
// 除了串行执行若干异步任务外,Promise还可以并行执行异步任务。
// 试想一个页面聊天系统,我们需要从两个不同的URL分别获得用户的个人信息和好友列表,这两个任务是可以并行执行的,用Promise.all()实现如下:

var p1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'P1');
    // reject(error.response.status);
});
var p2 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
    console.log(results); // 获得一个Array: ['P1', 'P2']
});
// 有些时候,多个异步任务是为了容错。比如,同时向两个URL读取用户的个人信息,只需要获得先返回的结果即可。这种情况下,用Promise.race()实现:

var p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
    console.log(result); // 'P1'
});
// 由于p1执行较快, Promise的then() 将获得结果 'P1'。
// p2仍在继续执行, 但执行结果将被丢弃。
最后编辑于 • 2018年05月16日 14:29 •  

你尚未登录,无法进行回复。