gpt4 book ai didi

javascript - 为什么 .then() 在没有 JavaScript promise 的情况下工作?

转载 作者:数据小太阳 更新时间:2023-10-29 04:41:29 24 4
gpt4 key购买 nike

为什么调用第二个函数 .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);
});
}

最佳答案

The then() method returns a Promise. See docs.

一个 promise 有一个处理程序方法。一旦一个 Promise 被履行或拒绝,相应的处理函数将被异步调用。处理函数的行为遵循一组特定的规则 as stated here .

让我们一一回顾。这是我们将并排检查的代码。它没什么特别的,只是一连串返回值的 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)
})
})
  1. returns a value, the promise returned by then gets resolved with the returned value as its value;

在代码中,这是 Say 2,以及您的原始问题。当返回一个值时,then() 返回一个 Promise,该 Promise 使用您返回的值进行解析。

  1. doesn't return anything, the promise returned by then gets resolved with an undefined value;

同上。

  1. throws an error, the promise returned by then gets rejected with the thrown error as its value;

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

  1. returns an already resolved promise, the promise returned by then gets resolved with that promise's value as its value;

在代码中,这是 Say 4,其中 promise 已被解决。所以现在 then() 返回一个 Promise,它被解析为值 4。

  1. returns an already rejected promise, the promise returned by then gets rejected with that promise's value as its value;

与上面相同,除了它现在拒绝。

  1. returns another pending promise object, the resolution/rejection of the promise returned by then will be subsequent to the resolution/rejection of the promise returned by the handler. Also, the value of the promise returned by then will be the same as the value of the promise returned by the handler.

在代码中,这是Say 5。如果您返回一个尚未解决的 promise,then() 将返回一个包含您的 promise 结果的 Promise,即 5。

需要注意的一件事,我最近也了解到(@Bergi 在评论中建议)是 then() 方法总是在链回调开始之前构造并返回一个新的 Promise执行。您传递给 then() 的回调只是告诉 promise promise 应该解决/拒绝的值/错误。

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

关于javascript - 为什么 .then() 在没有 JavaScript promise 的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com