我正在查看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 REPL中,为了获得一个承诺值的数据库连接,我采用了以下方法:
let connection
try {
(async () => {
connection = await returnsAPromiseResolvingToConnection()
})()
} catch(err) {
console.log(err)
}
带有await的行通常会返回一个promise。这段代码可以粘贴到Node.js的REPL中,或者保存在index.js中。它可以在Bash中运行
node -i -e "$(< index.js)"
这让你在运行脚本访问set变量后留在Node.js REPL中。例如,要确认异步函数已经返回,可以记录连接,然后就可以使用该变量了。当然,对于异步函数之外的脚本中的任何代码,人们都不希望依赖于异步函数被解析。
Pixelbits的答案是正确的,您应该始终使用.then()来访问生产代码中承诺的值。
但是,有一种方法可以在promise被解析后直接访问它的值,方法是使用以下不支持的内部Node.js绑定:
process.binding('util').getPromiseDetails(myPromise)[1]
警告:过程。binding从未打算在Node.js核心之外使用,Node.js核心团队正在积极考虑弃用它
文档:流程的弃用文档。绑定# 22004
从流程迁移。绑定# 22064
您可以使用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();
};