我正在查看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”?我遗漏了一些东西。


当前回答

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

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

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

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

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

其他回答

与你目前的理解略有不同的分析注释可能会有所帮助:

// promiseB will be resolved immediately after promiseA is resolved

这说明承诺b是一个承诺,但它将在承诺a被解决后立即解决。另一种理解方法是,promise .then()返回一个赋值给promiseB的promise。

// and its value will be the result of promiseA incremented by 1

这意味着promiseA解析得到的值是promiseB将接收到的作为其successCallback值的值:

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});

promiseB的.then函数接收来自promiseA的.then函数的返回值。

这里,promiseA返回一个数字,该数字将作为promiseB成功函数中的数字参数可用。然后会加1。

您可以使用JavaScript中的异步等待方法轻松做到这一点。

下面是一个使用超时检索WebRTC承诺值的示例。

function await_getipv4(timeout = 1000) { var t1 = new Date(); while(!window.ipv4) { var stop = new Date() - t1 >= timeout; if(stop) { console.error('timeout exceeded for await_getipv4.'); return false; } } return window.ipv4; } function async_getipv4() { var ipv4 = null; var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}}) findIP.then(ip => window.ipv4 = ip); return await_getipv4(); };

MDN文档帮助我解决了这个问题:

Promise.resolve ()

let promiseB = promiseA;

promiseB.then((value) => {
    console.log(value);
});

如果你需要查看JSON对象的多个层次:

let promiseB = promiseA;

promiseB.then((value) => {
    console.log(value?.key1.key2);
});

我觉得这个例子不言自明。注意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}