「rethrow」を非同期/待機で書き換える
以下に「rethrow」の例を示します。.then/catch
の代わりにasync/await
を使用して書き換えてください。
そして、demoGithubUser
におけるループを優先する形で再帰を削除してください。async/await
があればこれが簡単に行えます。
class
HttpError
extends
Error
{
constructor
(
response
)
{
super
(
`
${
response.
status}
for
${
response.
url}
`
)
;
this
.
name =
'HttpError'
;
this
.
response =
response;
}
}
function
loadJson
(
url
)
{
return
fetch
(
url)
.
then
(
response
=>
{
if
(
response.
status ==
200
)
{
return
response.
json
(
)
;
}
else
{
throw
new
HttpError
(
response)
;
}
}
)
;
}
// Ask for a user name until github returns a valid user
function
demoGithubUser
(
)
{
let
name =
prompt
(
"Enter a name?"
,
"iliakan"
)
;
return
loadJson
(
`
https://api.github.com/users/
${
name}
`
)
.
then
(
user
=>
{
alert
(
`
Full name:
${
user.
name}
.
`
)
;
return
user;
}
)
.
catch
(
err
=>
{
if
(
err instanceof
HttpError
&&
err.
response.
status ==
404
)
{
alert
(
"No such user, please reenter."
)
;
return
demoGithubUser
(
)
;
}
else
{
throw
err;
}
}
)
;
}
demoGithubUser
(
)
;
ここにコツはありません。demoGithubUser
内の.catch
をtry..catch
に置き換え、必要な場所にasync/await
を追加するだけです。
class
HttpError
extends
Error
{
constructor
(
response
)
{
super
(
`
${
response.
status}
for
${
response.
url}
`
)
;
this
.
name =
'HttpError'
;
this
.
response =
response;
}
}
async
function
loadJson
(
url
)
{
let
response =
await
fetch
(
url)
;
if
(
response.
status ==
200
)
{
return
response.
json
(
)
;
}
else
{
throw
new
HttpError
(
response)
;
}
}
// Ask for a user name until github returns a valid user
async
function
demoGithubUser
(
)
{
let
user;
while
(
true
)
{
let
name =
prompt
(
"Enter a name?"
,
"iliakan"
)
;
try
{
user =
await
loadJson
(
`
https://api.github.com/users/
${
name}
`
)
;
break
;
// no error, exit loop
}
catch
(
err)
{
if
(
err instanceof
HttpError
&&
err.
response.
status ==
404
)
{
// loop continues after the alert
alert
(
"No such user, please reenter."
)
;
}
else
{
// unknown error, rethrow
throw
err;
}
}
}
alert
(
`
Full name:
${
user.
name}
.
`
)
;
return
user;
}
demoGithubUser
(
)
;