我正在查看Angular文档中$q的例子,但我认为这可能适用于一般的承诺。下面的例子是从他们的文档中逐字复制的,包括他们的评论:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

我不清楚这是怎么回事。如果我可以对第一个.then()的结果调用.then(),将它们链接起来,我知道我可以,那么promiseB是一个promise对象,类型为object。它不是一个数字。那么“它的值将是承诺a加1的结果”是什么意思呢?

我应该像承诺的那样访问吗?。价值或类似的东西?如何成功回调返回承诺和返回“结果+ 1”?我遗漏了一些东西。


当前回答

实际上,在交互式(Node.js)提示符中,你可以“等待”:

> y = new Promise((resolve, reject) => resolve(23));
Promise {
   23,
   [Symbol(async_id_symbol)]: 10419,
   [Symbol(trigger_async_id_symbol)]: 5,
   [Symbol(destroyed)]: { destroyed: false }
}
> v = await y;
23

这在REPL实验时很有用。

你不能在一个“普通”函数中这样做:

> function foo() { let z = await y; return z; }
Uncaught SyntaxError:
Unexpected token 'y'

你可以在“async函数”中做到这一点,但这会让你保留一个承诺,而不是你想要的值:

> async function foo() { let z = await y; return z; }
undefined
> foo()
Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 10571,
  [Symbol(trigger_async_id_symbol)]: 5,
  [Symbol(destroyed)]: { destroyed: false }
}

其他回答

当一个promise被解决/拒绝时,它将调用它的成功/错误处理程序:

var promiseB = promiseA.then(function(result) {
   // do something with result
});

then方法还返回一个promise: promiseB,它将根据来自promiseA的成功/错误处理程序的返回值被解析/拒绝。

有三个可能的值,promise的成功/错误处理程序可以返回,将影响promise的结果:

什么都不回→承诺立即解决, undefined被传递给promise eb的成功处理程序 返回一个值→立即解析promise, 并将该值传递给promiseB的成功处理程序 返回承诺→当解决时,承诺将被解决。 当被拒绝时,承诺将被拒绝。传递给 promise的处理程序将是promise的结果

有了这样的理解,你就可以理解以下内容:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

然后调用立即返回promiseB。

当promise ea被解析时,它将把结果传递给promise ea的成功处理程序。

由于返回值是许诺ea的结果+ 1,成功处理程序返回一个值(上面的选项2),因此许诺eb将立即解析,许诺eb的成功处理程序将被传递许诺ea的结果+ 1。

Pixelbits的答案是正确的,您应该始终使用.then()来访问生产代码中承诺的值。

但是,有一种方法可以在promise被解析后直接访问它的值,方法是使用以下不支持的内部Node.js绑定:

process.binding('util').getPromiseDetails(myPromise)[1]

警告:过程。binding从未打算在Node.js核心之外使用,Node.js核心团队正在积极考虑弃用它

文档:流程的弃用文档。绑定# 22004 从流程迁移。绑定# 22064

我觉得这个例子不言自明。注意await是如何等待结果的,所以你错过了Promise的返回。

cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}

这里有一些很好的之前的答案,这里是ES6箭头函数版本:

var something = async() => {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

实际上,在交互式(Node.js)提示符中,你可以“等待”:

> y = new Promise((resolve, reject) => resolve(23));
Promise {
   23,
   [Symbol(async_id_symbol)]: 10419,
   [Symbol(trigger_async_id_symbol)]: 5,
   [Symbol(destroyed)]: { destroyed: false }
}
> v = await y;
23

这在REPL实验时很有用。

你不能在一个“普通”函数中这样做:

> function foo() { let z = await y; return z; }
Uncaught SyntaxError:
Unexpected token 'y'

你可以在“async函数”中做到这一点,但这会让你保留一个承诺,而不是你想要的值:

> async function foo() { let z = await y; return z; }
undefined
> foo()
Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 10571,
  [Symbol(trigger_async_id_symbol)]: 5,
  [Symbol(destroyed)]: { destroyed: false }
}