因此,我最近了解到了 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 的内部结构,那将是一个很大的帮助..;)
简而言之,从
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
实例的then()
方法最多接受两个参数:Promise
的已完成和已拒绝案例的回调函数。它立即返回一个等效的Promise
对象,允许您链接调用其他 Promise 方法。Promise
注意,它返回立即,它不会等待回调返回。因此,除非它可以预测未来,否则它不可能返回与回调返回相同的承诺。
它等价的 Promise 是调用它的 Promise,而不是回调返回的 Promise。
调用
then
返回的 Promise 将“锁定”并遵循 then
函数的“已完成”处理程序返回的 Promise。
它们不一样,它会匹配它的状态。如果所遵循的承诺处于待决状态,那么另一个也将处于待决状态。如果所遵循的承诺通过某个值得以实现,那么另一个承诺也将通过该值实现。
执行以下操作的承诺即使尚未解决,也被称为“已解决”。
我找到的最好的解释就在这里https://www.saurabhmisra.dev/promises-in-javascript-resolved-promise-fates/