美文网首页
JavaScript的一些思考,关于Promise

JavaScript的一些思考,关于Promise

作者: 剑来___ | 来源:发表于2017-09-14 00:07 被阅读8次

  Promise的产生源于JavaScript对异步编程的需求,以前的js,都是单线程的,但是,ajax技术出来之后,异步就成了网络请求中的主流。
  当我们需要确保某段代码在谁谁之后执行,我们就可以利用函数调用栈,将我们想要调用的代码放入回掉函数之中。

function test() {
    console.log('想要调用的代码')
}

function callback(test) {
    //.........之前调用的代码
    test();
}

  这样的话,就造成了传说中的回调地狱。代码可读性及其差。

ar fn = function(num) {
    return new Promise(function(resolve, reject) {
        if(typeof num == 'number') {
            resolve(num)
        } else {
            reject('TypeError')
        }
    })
}

fn(2).then(function(num) {
    console.log('first:' + num)
    return num + 1
}).then(function(num) {
    console.log('second:' + num)
    return num + 1
}).then(function(num) {
    console.log('third:' + num)
    return num + 1
})

  引入Promise之后的写法就相对可读性好一点。Promise对象有三个状态,pending、resolved、rejected。Promise对象的回调函数中reject()和resolve()是两个状态修改方法。pending只能修改为resolved或者rejected。

  • reject() 表示收到了结果,但不是期望的,将状态修改为拒绝(rejected)

  • resolve() 表示收到了结果,是预期的,将状态改为完成(resolved)

  • .then(resolve, reject) then函数是对于promise状态修改之后的操作函数,它接受两个回调函数,第一个参数是表示状态为resolved时执行。第二个为状态为rejected时执行。所以第二个参数一般不写,用.catch()捕获异常。即.then(null, function() {}) == .catch(){}

  • .all() 接受一个Promise队列数组,当数组中的Promise对象状态全部改变时才执行then方法。

  • .race() 和all方法相反,只要有一个promise对象状态改变,就执行then方法。

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); // [3, 1337, "foo"] 
});

相关文章

网友评论

      本文标题:JavaScript的一些思考,关于Promise

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