Promise 小测验

好的,我们已经初步了解了 Promise 的使用方式;了解了 .then() 怎么处理响应函数;知道 .then() 会返回新的 Promise 实例,所以可以链式调用;还知道 Promise.resolve() 是怎么转化普通类型到 Promise 类型的。可能有些同学看到这里,自我感觉良好,觉得已经学完了。所以接下来我们来做一个小测验,看看大家的掌握程度。

下面这道题出自 We have a problem with promises

问题:下面的四种 promises 的区别是什么?

(假定 doSomething()doSomethingElse() 都会返回 Promise 对象。另外请尽量在足够宽的屏幕上观看,不然换行可能会影响视觉效果。)

// #1
doSomething().then(function () {
  return doSomethingElse();
});

// #2
doSomething().then(function () {
  doSomethingElse();
});

// #3
doSomething().then(doSomethingElse());

// #4
doSomething().then(doSomethingElse);

仔细看一看,默想一下答案,不要着急往下翻。

好,准备好了么?我们继续了哟。

3...

2..

1.

答案揭晓

第一题

doSomething()
  .then(function () {
    return doSomethingElse();
  })
  .then(finalHandler);

答案:

doSomething
|-----------|
            doSomethingElse(undefined)
            |------------|
                         finalHandler(resultOfDoSomethingElse)
                         |------------|

这道题比较简单,几乎和前面的例子一样,我就不多说了。

第二题

doSomething()
  .then(function () {
    doSomethingElse();
  })
  .then(finalHandler);

答案:

doSomething
|-----------------|
                  doSomethingElse(undefined)
                  |------------------|
                  finalHandler(undefined)
                  |------------------|

这道题就有一定难度了。虽然 doSomethingElse 会返回 Promise 对象,但是因为 .then() 的响应函数并没有把它 return 出来,所以这里其实相当于 return null。我们知道,Promise.resolve() 在参数为空的时候会返回一个状态为 fulfilled 的 Promise,所以这里两步是几乎一起执行的。

第三题

doSomething()
  .then(doSomethingElse())
  .then(finalHandler);

答案:

doSomething
|-----------------|
doSomethingElse(undefined)
|---------------------------------|
                  finalHandler(resultOfDoSomething)
                  |------------------|

这一题的语法陷阱也不小。首先,doSomethingElsedoSomethingElse() 的区别在于,前者是变量,指向一个函数;而后者是则是直接执行了函数,并返回其返回值。所以这里 doSomethingElse 立刻就开始执行了,和前面 doSomething 的启动时间相差无几,可以忽略不计。然后,按照 Promise 的设计,当 .then() 的参数不是函数的时候,这一步会被忽略不计,所以 doSomething 完成后就跳去执行 finalHandler 了。

第四题

doSomething()
  .then(doSomethingElse)
  .then(finalHandler);

答案:

doSomething
|-----------|
            doSomethingElse(resultOfDoSomething)
            |------------|
                         finalHandler(resultOfDoSomethingElse)
                         |------------------|

这一题比较简单,就不解释了。


怎么样?都答对了么?还是有点小难度的,对吧?

results matching ""

    No results matching ""