如何解决如何调用嵌套提取?
我有一个像下面这样的代码:
@api_view(["POST"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def add_book(request):
print({"request.data": request.data})
payload = request.data
user = request.user
try:
author = Author.objects.get(id=payload["author"])
book = Book.objects.create(
title=payload["title"],description=payload["description"],added_by=user,author=author,# who_can_see= [author,payload["who_can_see"]] # ?
)
serializer = BookSerializer(book)
return JsonResponse({'books': serializer.data},safe=False,status=status.HTTP_201_CREATED)
except ObjectDoesNotExist as e:
return JsonResponse({'error': str(e)},status=status.HTTP_404_NOT_FOUND)
except Exception:
return JsonResponse({'error': 'Something terrible went wrong'},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
现在,我想要做的是使用 const url = "https://something";
let data2 = JSON.stringify({ source: "https://someimage.jpg" });
const test1 = fetch(url,{
method: "POST",headers: {
"Content-Type": "application/json","Ocp-Apim-Subscription-Key": "mykey",},body: data2,}).then((res) =>
console.log("postHeaderResult" + res.headers.get("Operation-Location"))
);
标头,它是一个 Operation-Location
地址并发送一个 url
请求,然后从这个新请求的正文中获得最终答案.
我已经尝试了以下代码,但它不起作用:
GET
与此同时,如果我尝试我的代码 here,我会在 const url = "https://something";
let data2 = JSON.stringify({ source: "https://someimage.jpg" });
const test1 = fetch(url_to_formRecognizer,})
.then((res) =>
console.log("postHeaderResult" + res.headers.get("Operation-Location"))
)
.then((res1) =>
fetch(test1.headers.get("Operation-Location"),{
method: "GET",headers: {
"Ocp-Apim-Subscription-Key": "34dd609bcb5742de91e8474f0e27e88e",}).then((res1) => console.log("finalResult" + res1 + "simple"))
);
上收到一个错误,但是在我的 test1
中我没有收到任何编译错误,尽管 get 请求是不执行。
我什至尝试了以下行:
visual studio
捕获错误但它也是空的。我不明白问题是什么,我做错了什么。
您的帮助将不胜感激。
更新 1:
这是我基于答案的新代码。但是,由于我的第二次通话,我终于“还没有开始”。好像在第一个调用还没真正结束之前,第二个调用就开始了。
.catch((err) => console.log("odsPolicyRequestError" + err));
解决方法
你离得不远了,但是:
-
您的调试执行处理程序正在干扰,将
fetch
的执行值替换为undefined
(console.log
的返回值)。你会想要删除它。 -
不要使用
test1
变量。履行值提供给履行处理程序(您的回调传递给.then
)。这就是您想要使用的。
像这样:
const url = "https://something";
let data2 = JSON.stringify({ source: 'https://someimage.jpg'});
fetch(url_to_formRecognizer,{
method: "POST",headers: { 'Content-Type': 'application/json','Ocp-Apim-Subscription-Key': 'mykey'},body: data2
}).then(res1 => fetch(res1.headers.get("Operation-Location"),{
method: "GET",headers: {'Ocp-Apim-Subscription-Key' : '34dd609bcb5742de91e8474f0e27e88e' }})
).then(res2 => {
console.log("finalResult" + res2 + "simple");
});
但请注意,这不会消耗第一个响应或第二个响应的主体。看起来您可能不需要第一个的正文,但我猜您至少需要第二个的正文。
或者,如果您可以使用 async
函数,则此代码(在 async
函数中)可以使用 await
而不是 .then
:
const url = "https://something";
let data2 = JSON.stringify({ source: 'https://someimage.jpg'});
const res1 = await fetch(url_to_formRecognizer,body: data2
});
if (!res1.ok) {
throw new Error("HTTP error " + res1.status + " on first fetch");
}
const res2 = await fetch(res1.headers.get("Operation-Location"),headers: {'Ocp-Apim-Subscription-Key' : '34dd609bcb5742de91e8474f0e27e88e' }
});
if (!res2.ok) {
throw new Error("HTTP error " + res2.status + " on second fetch");
}
console.log("finalResult" + res2 + "simple");
旁注:您的代码正在成为 fetch
API 中的小枪的牺牲品(我写了 here)。 fetch
只拒绝对 network 错误的承诺,而不是 HTTP 错误。您需要明确检查是否在 HTTP 级别工作。您可以这样做:
const url = "https://something";
let data2 = JSON.stringify({ source: 'https://someimage.jpg'});
fetch(url_to_formRecognizer,body: data2
}).then(res1 => {
if (!res1.ok) {
throw new Error("HTTP error " + res1.status + " on first fetch");
}
return fetch(res1.headers.get("Operation-Location"),{
method: "GET",headers: {'Ocp-Apim-Subscription-Key' : '34dd609bcb5742de91e8474f0e27e88e' }
});
}).then(res2 => {
if (!res2.ok) {
throw new Error("HTTP error " + res2.status + " on second fetch");
}
console.log("finalResult" + res2 + "simple");
});
(或者使用 fetch
包装器为您执行 ok
检查,正如我在链接的博客文章中所述。)
旁注 2:重要的是始终处理承诺拒绝(在这种情况下,可能在末尾带有 .catch
)或将承诺链传回给调用者,以便调用者可以检查它。您的代码似乎也没有。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。