JavaScript的一些思考,关于Promise

  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"] 
});

推荐阅读更多精彩内容

  • 本文适用的读者 本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,...
    HZ充电大喵阅读 5,369评论 6 19
  • Promise的含义:   Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和...
    呼呼哥阅读 1,427评论 0 16
  • 00、前言Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区...
    夜幕小草阅读 1,164评论 0 12
  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 2,040评论 0 19
  • 先放代码: '/home/python_learning/nickname.list'内容大约是: \346\26...
    AdH阅读 449评论 0 0