调用async函数返回[object Promise]无法获取实际返回值如何解决
问题根因
async函数的返回值会被自动包装为Promise对象,你在fetchAndStream中调用handleRequest()时没有使用await解析Promise的实际结果,直接拿到的是Promise实例,转字符串后就是[object Promise],拼接请求地址自然会出错。
你的代码还存在两个会触发运行错误的隐藏问题:
- 定义
fetchAndStream时没有声明接收request入参,调用时传入的event.request在函数内部无法获取,传给handleRequest时会传入undefined uri变量未做声明就直接赋值,严格模式下会直接抛出语法错误,非严格模式下会污染全局作用域
修正代码
只需要在调用handleRequest时加上await等待结果返回,同时补全函数入参、声明局部变量即可:
addEventListener("fetch", event => { event.respondWith(fetchAndStream(event.request)) }); async function handleRequest(request) { var uri = request.url.replace(/^https:\/\/.*?\//gi, "/"); return uri; } async function fetchAndStream(request) { // 加await解析Promise拿到实际uri字符串,同时用const声明局部变量 const uri = await handleRequest(request); console.log(uri); let response = await fetch('http://blablabla.com/' + uri); const responseInit = { headers: { 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename="file.m3u"', } }; return new Response(response.body, responseInit) }
优化建议
如果handleRequest内部没有其他需要await的异步操作(比如远程请求、KV存储读写等),可以直接去掉函数前的async关键字,将它改为普通同步函数,调用时不需要加await就能直接拿到返回值,减少不必要的Promise包装开销。
内容的提问来源于stack exchange,提问作者maik
相关产品推荐
相关产品推荐

