如何从已完成状态的Promise对象中提取返回的字符串值?
如何从Promise结果中获取对应字符串值
我的代码片段:
static base64URLEncode(t) { return t.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "") }
function buf2Base64(buffer) { return (pks.constructor.base64URLEncode(pks.fromByteArray(new Uint8Array(buffer)))); }
async function test2(inputString) { inputBytes = pks.constructor.textEncodeLite(inputString); hashBytes = await window.crypto.subtle.digest("SHA-256", inputBytes); bufbase = buf2Base64(hashBytes); return bufbase; }
控制台输出的Promise状态:
Promise { <state>: "fulfilled", <value>: "xPCEgWjxihl6bIHJfpjrebwZzg0cn83ZokhVEwRVG2w" } <state>: "fulfilled" <value>: "xPCEgWjxihl6bIHJfpjrebwZzg0cn83ZokhVEwRVG2w" <prototype>: Promise.prototype { … }
我试了JSON.stringify(test2(pks.generateCodeVerifier()));,结果返回"{}",请问该怎么正确取出<value>对应的字符串?
解决办法:
直接调用test2()得到的是Promise对象,不是最终的返回值,所以JSON.stringify处理的是Promise实例,自然输出空对象"{}"。要拿到Promise内部的已兑现值,有两种常用方式:
方式1:用async/await(代码更简洁,推荐)
因为test2本身是async函数,你可以在另一个async函数里用await获取结果:
async function getFinalValue() { const targetString = await test2(pks.generateCodeVerifier()); console.log(targetString); // 这里就是你要的字符串 // 如果需要转成JSON字符串 console.log(JSON.stringify(targetString)); } getFinalValue();
方式2:用Promise的.then()回调
如果没法用async函数,就用Promise的回调方法:
test2(pks.generateCodeVerifier()).then(targetString => { console.log(targetString); // 目标字符串 console.log(JSON.stringify(targetString)); });
为什么之前的方法不行?
async函数的返回值本质是一个Promise对象,只有当Promise状态变为fulfilled后,才能通过await或者.then()拿到内部的兑现值。直接对Promise对象做JSON.stringify,会因为Promise的内部属性不可枚举,最终输出空对象{}。
内容的提问来源于stack exchange,提问作者Oswald Jenna
相关产品推荐
相关产品推荐

