‘then’函数返回的promise与‘then’函数内的回调返回的promise是否相同?

问题描述 投票:0回答:3

因此,我最近了解到了 Promise 的概念,并被告知出于链接目的,我们使用“then”,它实际上是在实现附加的 Promise 对象时调用的。而且,为了在这个对象被解析后做一些工作,我可以在 then 内部有一个回调,它再次可以返回 Promise。 因此,如果“then”函数内的这个 cb 返回一个 Promise,并且“then”本身返回一个 Promise,那么,这是否意味着“then”函数从 cb 中获取这个 Promise 并直接按原样返回。 这是代码:

let p2;

function firstpromise() {
  return new Promise((resolve, reject) => {
    setTimeout
      (
        () => {
          console.log("first promise completed");
          resolve("first promise resolved");
        }, 10000
      );
  });
}
const p = firstpromise();
const pro = p.then((data) => {
  p2 = new Promise((resolve, reject) => {
    setTimeout
      (
        () => {
          console.log("second promise completed" + data);
          resolve("second promise resolved");
        }, 5000
      );
  });
  return p2;
});

console.log(pro === p2);

一旦承诺得到解决,pro 和 p2 在控制台上都会给出相同的结果,所以这让我认为 pro 和 p2 是相同的。 为了简化我的困惑: 当我写 fun1(fun2); 时我正在调用 fun1 函数并在其中传递 fun2 。现在由 fun1 是否调用 fun2 决定。假设调用 fun2 并且它向 fun1 返回“hello”。但 fun1 可能会向我们返回“再见”。所以一直以来我们都没有意识到 fun2 返回的任何值。 所以我的问题是,函数“then”返回了一个承诺,但在内部它调用了 secondarypromise 函数,该函数本身“将承诺返回给 then 函数”,所以它是否意味着“然后”,因为它向前返回了第二个返回给它的相同承诺承诺功能? 另外,console.log(pro===p2);实际上打印错误。 如果有人可以特别解释 then 的内部结构,那将是一个很大的帮助..;)

javascript promise callback es6-promise asynchronous-javascript
3个回答
1
投票

简而言之,从

then()
返回的 Promise 与回调中返回的 Promise 不同。当您在 Promise 上调用
then()
时,会立即返回新的 Promise,该 Promise 在回调运行后得到解决(或拒绝)。

由于 Promise 是异步的,因此在返回任何内容之前它不能等待回调被处理(如果基本 Promise 从未解析,它们将永远不会被处理)。如果是这种情况,那么链式承诺永远无法对前一个承诺的结果起作用(例如从外部源获取数据)

这里是如果需要等待回调会发生什么的示例。

// Fetch returns a promise which will resolve when the request is done
const promise1 = fetch('example.com');

// Adding another promise to the chain with .then() is simply saying
// "when the previous promise resolves, do this next". In this case the
// next thing would be to parse the result as json. Since this callback
// depends on the response from fetch, it can't be called until the response
// is available.
// response.json() in turn returns a new promise (much like in your example)
// which will resolve when the json is fully loaded and parsed.
const promise2 = promise1.then(response => response.json());

// when the data has been parsed, maybe we process it or log it or something
const promise3 = promise2.then(data => { /* Process data */ });

// Logging promise3 here will show a pending promise, which is waiting
// for all the previous promises to execute since it is part of the "chain"
// and when we get here "fetch" is most likely just starting the request
// and no callbacks will have been called yet, but we still have a promise
// of a future resolt of some sort.
console.log(promise3);

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


0
投票

来自 Promise.prototype.then()

的文档

then()
实例的
Promise
方法最多接受两个参数:
Promise
的已完成和已拒绝案例的回调函数。它立即返回一个等效的
Promise
对象,允许您链接调用其他 Promise 方法。

注意,它返回立即,它不会等待回调返回。因此,除非它可以预测未来,否则它不可能返回与回调返回相同的承诺。

它等价的 Promise 是调用它的 Promise,而不是回调返回的 Promise。


0
投票

调用

then
返回的 Promise 将“锁定”并遵循
then
函数的“已完成”处理程序返回的 Promise。

它们不一样,它会匹配它的状态。如果所遵循的承诺处于待决状态,那么另一个也将处于待决状态。如果所遵循的承诺通过某个值得以实现,那么另一个承诺也将通过该值实现。

执行以下操作的承诺即使尚未解决,也被称为“已解决”。

我找到的最好的解释就在这里https://www.saurabhmisra.dev/promises-in-javascript-resolved-promise-fates/

© www.soinside.com 2019 - 2024. All rights reserved.