Javascript,Promise.then返回值

时间:2018-02-11 13:26:58

标签: javascript node.js callback promise es6-promise

Promises进行一些研究,我知道Promise对象可以处于三种状态(待定,已解决,被拒绝)。负责这三种状态中的每一种的逻辑都在一个回调函数中,该函数被传递到Promise构造函数中。这个回调函数有两个函数作为其参数resolve和reject,当这个回调导致成功或失败时调用它们。

在实例化Promise之后,我们可以通过调用其上的.then函数将响应处理程序回调添加到promise。 .then函数将2个回调函数作为其参数。第一个参数是在调用Promise resolve函数时调用回调函数,在调用Promise拒绝函数的情况下调用第二个回调函数。您也可以在.catch上调用Promises来处理被拒绝的承诺,尽管这只是语法糖:

.then(undefined, () => { failure callback})

我发现更难理解的是.then method returns a Promise。例如,在以下代码中:

实施例

let random = (Math.random() * 10);

let promise = new Promise((res, rej) => {
  if (random >= 5) {
    res(random);
  }

  rej(random);
});



promise
  .then(
    (nr) => {
      console.log("succes: " + nr);
      return nr + 5;
    })
  .then((nr) => {
    console.log(nr);
  })
  .catch(
    (nr) => {
      console.log("failure: " + nr);
    })

问题:

在第一个.then的示例中,它返回:nr + 5。在解决Promise的情况下,此值已成功传递到第二个.then。这怎么可能?它是否在引擎盖下:

return new Promise((res,rej) => {
    res(nr + 5)
})

或者这是由其他原因引起的?

3 个答案:

答案 0 :(得分:3)

这是承诺的行为,在此描述

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

在返回值部分:

  

如果处理函数返回一个值,then返回的承诺   以返回值作为其值来解析;

答案 1 :(得分:2)

是的,这是major features of promises中的一个:它们是可链接的。

then方法会返回一个新的承诺,该承诺将使用回调结果解析。它确实构造了一个new Promise,并在调用回调函数时使用返回值调用resolve

您可能需要查看this toy implementation以了解它是如何实现的(尽管没有错误处理)。

答案 2 :(得分:2)

请注意: Promises chaining

  

通常,.then处理程序返回的值会立即传递给下一个处理程序。但是有一个例外。

     

如果返回的值是一个promise,则进一步执行将暂停,直到它结束。之后,该承诺的结果将被赋予下一个.then处理程序。

基本上,当你返回一个值,即:(nr + 5) or 5 or [1, 2] or {a: 1}等时,该值会立即传递给下一个处理程序(.then)。