为什么.then()在JavaScript中没有承诺?

jjr*_*bit 7 javascript promise

为什么调用第二个函数.then(notPromise)仍然将参数传递给第三个函数.then(promiseC),即使notPromise()只是一个常规函数?

我认为只有promises可以与.then()一起使用,但不知何故它仍然可以正确执行(并传递参数).

promiseA()
    .then(notPromise)
    .then(promiseC);


function promiseA() {
    return new Promise(function (resolve, reject) {
        const string = "a";
        resolve(string);
    });
}


function notPromise(string) {
    const nextString = "b"
    const finalString = string + nextString;

    return finalString;
}


function promiseC(string) {
    return new Promise(function (resolve, reject) {
        const nextString = "c";

        const finalString = string + nextString;

        alert(finalString);
        resolve(finalString);
    });
}
Run Code Online (Sandbox Code Playgroud)

Ras*_*ash 7

then()方法返回一个Promise. 查看文档.

promise有一个处理程序方法.一旦Promise被完成或拒绝,将异步调用相应的处理函数.处理程序函数的行为遵循此处所述的一组特定规则.

我们一个接一个地回顾一下.这是我们将并排检查的代码.它没什么特别的,只是一连串的承诺回归价值.

let sequence = new Promise(function (resolve) {
  console.log('Say 1')
  resolve(1)
})

sequence
  .then(() => {
    console.log('Say 2')
    return 2
  })
  .then(() => {
    console.log('Say 3')
  })
  .then(() => {
    console.log('Say 4')
    return Promise.resolve(4)
  })
  .then(() => {
    return new Promise(function (resolve) {
      console.log('Say 5')
      setTimeout(() => { resolve(5) }, 1000)
    })
  })
Run Code Online (Sandbox Code Playgroud)
  1. 返回一个值,然后返回的promise将以返回值作为其值来解析;

在代码中,这是Say 2和您原来的问题.返回值时,then()返回一个Promise ,使用返回的值解析该Promise.

  1. 不返回任何内容,然后返回的promise将以未定义的值解析;

与上述相同.

  1. 抛出一个错误,然后返回的promise被抛出错误作为其值被拒绝;

与上面相同,除了现在then()返回一个被错误拒绝的Promise.

  1. 返回已经解析的promise,然后返回的promise将以promise的值作为其值来解析;

在代码中,这是Say 4承诺已经解决的地方.所以现在then()返回一个Promise,用值4解析.

  1. 返回一个已被拒绝的promise,然后返回的promise将被拒绝,并将该promise的值作为其值;

同上,但现在拒绝.

  1. 返回另一个待处理的promise对象,当时返回的promise的解析/拒绝将在处理程序返回的promise的解析/拒绝之后.此外,then返回的promise的值将与处理程序返回的promise的值相同.

在代码中,这是Say 5.如果您返回尚未解决then()的承诺,将返回承诺的结果,即5.

有一点需要注意的是,我最近实际学到的东西(@Bergi在评论中建议)是该then()方法总是在链回调甚至开始执行之前构造并返回一个新的Promise.您传递的回调then()只是告诉承诺应该解析/拒绝承诺的值/错误.

总而言之,这就是为什么then()链接工作即使你没有专门返回一个新的Promise - 因为then()方法总是在幕后构造一个新的承诺,并拒绝/解析你所返回的值.上述场景中最复杂的情​​况是当您在回调中返回Promise时,在这种情况下,您的回调承诺的结果将传递给then()promise.

  • "*如果你在那里返回另一个承诺,则会返回该承诺.*" - 不,那不是'then`的工作方式.这完全不起作用.它*总是*创造并返回一个新的承诺 (3认同)