向诺言处理者传递另一个诺言



我希望承诺处理程序可以记录Promise p1(而不是值" A"),因为console.logp1直接调用。但是,它以某种方式记录了" A"。Promise p1如何自动解决为" A",而不会被要求?例如,console.log(p1)不会直接输出" A"。幕后发生了什么事吗?

var p1 = new Promise(function(resolve, reject) {
  resolve("A");
});
var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});
p2.then(function(v) {
  console.log(v)
});

编辑:我知道呼叫

p1.then((v) => return v))

返回一个新的承诺,该诺言是通过v。

var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});
p2.then(function(v) {
 console.log(v)
});

成为

console.log(p1).

由于console.log是直接使用p1调用的,而不是p1的结果。>

var promise = new Promise(function(resolve, reject) {
  resolve("B")
})
console.log(promise)

不导致字符串" B"。

edit2:我误解了将解决参数传递给执行人的内容是未完成功能的包装器,这使我感到困惑。查看为什么承诺构造函数需要一个函数,该函数在完成后调用"解决",而"然后"却没有 - 它返回值?有关更多详细信息。

来自MDN文档:

Promise.resolve(value)

返回一个用给定值解决的承诺对象。如果是 值是当时的(即有一个方法),返回的承诺 将"遵循"当时的最终状态;否则 返回的承诺将通过价值实现。通常,如果 您不知道价值是否是诺言,诺言(value) 它取而代

p1是可行的,所以返回承诺遵循它。

解决另一个诺言的承诺将自动等待另一个诺言的结果。

这是使承诺可连锁的原因(then()回调中的进一步承诺)。

来自MDN Promise().then()返回值:

返回已经实现的承诺,当时归还的诺言将其作为其价值作为其价值实现。

如果处理程序函数返回Promise(),它将自动获取值


我写了一篇文章来解释处理程序功能的返回值更多详细信息

如果处理程序功能...

  • 不返回值
var promise = Promise.resolve().then(() => {
  // no return;
});
promise.then((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "fulfilled", <value>: undefined }
value = undefined
  • 不是Promise的返回值
var promise = Promise.resolve().then(() => {
  return "value";
});
promise.then((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "fulfilled", <value>: "value" }
value = value
  • return Promise.resolve()
var promise = Promise.resolve().then(() => {
  return Promise.resolve("value");
});
promise.then((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "fulfilled", <value>: "value" }
value = value
  • return Promise.reject()
var promise = Promise.resolve().then(() => {
  return Promise.reject("value");
});
promise.catch((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "rejected", <reason>: "value" }
value = value
  • 返回等待Promise()
var promise = Promise.resolve().then(() => {
  return new Promise((resolve, reject) => {
    resolve("value");
  });
});
promise.then((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "fulfilled", <value>: "value" }
value = value
  • throws "error";
var promise = Promise.resolve().then(() => {
  throw "error";
});
promise.catch((value) => {
  console.log(promise);
  console.log("value =", value);
});
Promise { <state>: "rejected", <reason>: "error" }
value = error

参考:Promise()处理程序函数返回值,MDN

最新更新