• fatty Jack
    2019-10-10
    老师讲的很好 不枯燥啊

    作者回复: 谢谢,录这段的时候已经有点困了

    
     5
  • L Y L
    2019-12-02
    老师我想请教下,Promise.all 处理多个错误,视频中说得存下所有变量后处理具体是怎样呢,是在catch中再一个个catch吗?

    作者回复: const result = {};
    let error = null;
    Promise.all([
        promiseA.then(res=> {
            result['A'] = res; return res;
        }).catch(e=> {
            error = e;
        }),
        promiseB.then(res=> {
            result['B'] = res; return res;
        }).catch(e=> {
            error = e;
        })
    ]).then(()=> { xxx })

    像这样写,所有的Promise就会在自己resolve之后把数据存在result里,然后所有的Promise在出错时也会把错误存起来,并且转到resolved状态

    这样子,程序的逻辑就是Promise.all会等待所有的Promise执行完成,并且可以拿到所有Promise各自的结果。而不是“有任意Promise失败就回调。”

     1
     3
  • TechCheng
    2019-11-03
    (function () {
            var promise = new Promise(
                function (resolve, reject) {
                    setTimeout(() => {
                       reject(new Error('3'))//改成这样比较好throw new Error('3')
                    }, 1000)
                }
            ).then((resolve) => {
                console.log(resolve)
            }, (reject) => {
                console.log('reject', reject)
            }).catch((err) => {
                console.log(err)
            })
        })()
    上面的 reject(new Error('3')) 改成这样 throw new Error('3') 应该更好说明『任何任何一个rejected状态且后面没有.catch的Promise,都会造成浏览器/Node环境的全局错误』,不然没有catch,在then中照样可以捕获reject中的异常。
    展开

    作者回复: 你提醒我了,then还可以传第二个参数,作用和catch一样。我习惯了then只传一个参数的情况,直接给忘了。

    但是你这样抛错误,promise应该是不会进rejected状态的

     1
     2
  • 递归涛
    2019-10-22
    老师,所以promise.then能根据return和Error判断第二次返回的的promise的状态,这个特点有什么用么

    作者回复: 有时候一个异步流程是由很多个子异步流程组合起来的。比如求职这个例子里整个求职过程是由三次面试组成的。

    这时候你整个求职过程的成功和失败就取决于每一次的成功和失败。而不只是第一个promise

     2
     1
  • lstrive
    2019-10-12
    老师,视频教程还是偏基础是么?因为很多nodejs的内容经常看到,也是基础的内容,接触过node多少已经掌握了一些了,不知道实战会不会又更加硬核的东西~~~😁😁

    作者回复: 计划就是第二章面向初学者。后面会难的

    
     1
  • 梁亮
    2020-01-11
    在老师代码的基础上完善了一点,很有意思,谢谢。

    function interview(company, name, round) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          let possibility = Math.random();
      
          if(possibility < 0.7) {
            resolve(`${company}: ${name} pass ${round} round `);
          } else {
            reject(new Error(`${company}: ${name} fail ${round} round`));
          }
        }, 1000);
      });
    }

    function tecentInterview(candidate) {
      let company = 'tecent';

      return interview(company, candidate, '1')
      .then((res) => {
        console.log(res);
        return interview(company, candidate, '2');
      })
      .then((res) => {
        console.log(res);
        return interview(company, candidate, '3');
      })
      .then((res) => {
          console.log(res);
          return new Promise(resolve => resolve("tecent invitation"));
        }
      )
      .catch(
        (err) => {
          return new Promise((resolve, reject) => {
            reject(err);
          });
        }
      );
    }

    function geekbangInterview(candidate) {
      let company = 'geekbang';

      return interview(company, candidate, '1')
      .then((res) => {
        console.log(res);
        return interview(company, candidate, '2');
      })
      .then((res) => {
          console.log(res);
          return new Promise(resolve => resolve("geekbang invitation"));
        }
      )
      .catch(
        (err) => {
          return new Promise((resolve, reject) => {
            reject(err);
          });
        }
      );
    }

    candidate = 'lyon'
    Promise.all([
      tecentInterview(candidate),
      geekbangInterview(candidate)
    ]).then(
      (res) => {
        console.log(res);
      }
    ).catch(err => {
      console.log(err);
    });
    展开
    
    
  • wine99
    2019-12-27
    对promise不熟悉的同学,可以看看下面代码的运行结果,反正我刚开始是懵懵的哈哈

    // 在then或catch中手动返回一个Promise

    ;(function () {
        var promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('success')
            }, 500)
        })
        var promise2 = promise1.then((res) => {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    // resolve('accept')
                    reject(new Error('refuse'))
                }, 500)
            })//.catch(err => { console.log(err.message) })
        })//.catch(err => { console.log(err.message) })
        promise2.catch((err) => { console.log(err.message) })
        // 注意上面两个注释起来的catch也能抓住'refuse',但如果是上面两个抓住的,1200ms的最后输出,promise2就不是reject,而是<resolved>:undefined
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 300)
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 800)
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 1200)
    })()

    // 下面的代码和上面的区别在于promise1的then中不是在return new Promise中setTimeout,而是在setTimeout中return new Promise
    ;(function () {
        var promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('success')
            }, 500)
        })
        var promise2 = promise1.then((res) => {
            setTimeout(() => {
                return new Promise((resolve, reject) => {
                    // resolve('accept')
                    reject(new Error('refuse'))
                })//.catch(err => { console.log(err.message) })
            }, 500)
        })//.catch(err => { console.log(err.message) })
        promise2.catch((err) => { console.log(err.message) })
        // 对于这种情况,只有return new Promise后面紧跟的catch能抓住'refuse'(也就是三个catch中的第一个catch)
        // 并且,无论是resolve('accept')还是reject(new Error('refuse')),500ms后promise2的状态一直都是<resolved>:undefined状态
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 300)
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 800)
        setTimeout(() => {
            console.log(promise1, promise2)
        }, 1200)
    })()
    展开

    作者回复: 很棒!

    
    
  • blabla
    2019-11-05
    听到老师说困了,我就一下子笑了,大早上的我也是听困了,不过不是老师讲的不好哦,嘿嘿,谢谢,比之前更明了promise的用法了,之前每次用的时候都得纠结好久,试错好几次,,,

    作者回复: 通宵录课容易么

    
    
  • TechCheng
    2019-11-03
    『任何一个rejected状态且后面没有.catch的Promise,都会造成浏览器/Node环境的全局错误』
    应该是都有可能会造成全局错误吧???
    
    
  • Root
    2019-10-23
    学到了,promise是个渣男!!!以后跟别人解释知道怎么说了。

    作者回复: 也有可能遇到promise了就一定resolve的好男人的(抠鼻)

    
    
  • 一笑先生
    2019-10-14
    一直在用,还是知道怎么回事好些,给赞
    
    
  • Ada.H
    2019-10-14
    🤓 面试的例子很形象,可算知道怎么使用promise了!
    
    
  • Mr-L.x.D..☻
    2019-10-14
    思路清晰、声音好听,老师加油
    ‘promise不只是渣男,还是状态机’瞬间让这节课有趣了起来
     1
    
我们在线,来聊聊吧