Promises returned data ''
my data which is fetched from youtube is using nodejs is -
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28652353' },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17328447'
}]
Now I want to search 5 related videos to each video
my api
getVids(videosID)
.then(result => {
console.log(result) //this is the data which I showed above
result.sort((a,b) => b.view - a.view);
return result;
})
.then(result => {
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
})
.then(result => {
console.log(result);
})
.catch(err => {
console.log(err)
})
and api to 5 related Videos is given below
function relatedVideos(videoId) {
return new Promise((resolve, reject) => {
let urls = 'https://www.googleapis.com/youtube/v3/search?relatedToVideoId=' + videoId + '&key=' + API_KEY + '&part=snippet&type=video';
request(urls, (err, result) => {
const data = JSON.parse(result.body);
const relatedVideos = ;
data.items.forEach(related => {
relatedVideos.push({
title: related.snippet.title
});
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
});
});
});
}
It is giving the output like
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28655496',
relatedVideos: Promise { <pending> } },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17334681',
relatedVideos: Promise { <pending> }
}]
How to solve this pending
problem or how to wait so it gets full data.
javascript node.js asynchronous async-await
add a comment |
my data which is fetched from youtube is using nodejs is -
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28652353' },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17328447'
}]
Now I want to search 5 related videos to each video
my api
getVids(videosID)
.then(result => {
console.log(result) //this is the data which I showed above
result.sort((a,b) => b.view - a.view);
return result;
})
.then(result => {
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
})
.then(result => {
console.log(result);
})
.catch(err => {
console.log(err)
})
and api to 5 related Videos is given below
function relatedVideos(videoId) {
return new Promise((resolve, reject) => {
let urls = 'https://www.googleapis.com/youtube/v3/search?relatedToVideoId=' + videoId + '&key=' + API_KEY + '&part=snippet&type=video';
request(urls, (err, result) => {
const data = JSON.parse(result.body);
const relatedVideos = ;
data.items.forEach(related => {
relatedVideos.push({
title: related.snippet.title
});
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
});
});
});
}
It is giving the output like
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28655496',
relatedVideos: Promise { <pending> } },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17334681',
relatedVideos: Promise { <pending> }
}]
How to solve this pending
problem or how to wait so it gets full data.
javascript node.js asynchronous async-await
add a comment |
my data which is fetched from youtube is using nodejs is -
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28652353' },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17328447'
}]
Now I want to search 5 related videos to each video
my api
getVids(videosID)
.then(result => {
console.log(result) //this is the data which I showed above
result.sort((a,b) => b.view - a.view);
return result;
})
.then(result => {
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
})
.then(result => {
console.log(result);
})
.catch(err => {
console.log(err)
})
and api to 5 related Videos is given below
function relatedVideos(videoId) {
return new Promise((resolve, reject) => {
let urls = 'https://www.googleapis.com/youtube/v3/search?relatedToVideoId=' + videoId + '&key=' + API_KEY + '&part=snippet&type=video';
request(urls, (err, result) => {
const data = JSON.parse(result.body);
const relatedVideos = ;
data.items.forEach(related => {
relatedVideos.push({
title: related.snippet.title
});
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
});
});
});
}
It is giving the output like
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28655496',
relatedVideos: Promise { <pending> } },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17334681',
relatedVideos: Promise { <pending> }
}]
How to solve this pending
problem or how to wait so it gets full data.
javascript node.js asynchronous async-await
my data which is fetched from youtube is using nodejs is -
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28652353' },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17328447'
}]
Now I want to search 5 related videos to each video
my api
getVids(videosID)
.then(result => {
console.log(result) //this is the data which I showed above
result.sort((a,b) => b.view - a.view);
return result;
})
.then(result => {
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
})
.then(result => {
console.log(result);
})
.catch(err => {
console.log(err)
})
and api to 5 related Videos is given below
function relatedVideos(videoId) {
return new Promise((resolve, reject) => {
let urls = 'https://www.googleapis.com/youtube/v3/search?relatedToVideoId=' + videoId + '&key=' + API_KEY + '&part=snippet&type=video';
request(urls, (err, result) => {
const data = JSON.parse(result.body);
const relatedVideos = ;
data.items.forEach(related => {
relatedVideos.push({
title: related.snippet.title
});
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
});
});
});
}
It is giving the output like
[ { title:
'Dil Zaffran Video Song | Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak',
id: 'vChX3XZXqN4',
view: '28655496',
relatedVideos: Promise { <pending> } },
{ title:
'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
id: 'e_vl5aFXB4Q',
view: '17334681',
relatedVideos: Promise { <pending> }
}]
How to solve this pending
problem or how to wait so it gets full data.
javascript node.js asynchronous async-await
javascript node.js asynchronous async-await
asked Nov 23 '18 at 20:17
RupeshRupesh
406213
406213
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
It happens because you assign the promise returned by relatedVideos()
to the property relatedVideos
, you never actually wait for it to resolve. You need to await all of the promises before you proceed, this is most easily done with Promise.all()
. Let's focus on this part of your code:
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
What you need to do is to wait for each promise to resolve in order to get its resolved value before you assign it to the object. Then you also need to create a promise that doesn't resolve until all of those promises have resolved. This is what Promise.all()
is for. Change the code mentioned above into this:
return Promise.all(result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
return relatedVideos(el.id)
.then(function(relatedVideo) {
o.relatedVideos = relatedVideo;
return o;
});
}));
Please note that ALL of the promises mapped to Promise.all()
needs to resolve in order for the chain to continue with the next then
. If even one of those promises rejects or don't resolve at all it will never continue. You have a condition for your resolve()
call in the relatedVideos()
function. This implies that in some cases a promise might end up never resolving. You should always resolve or reject a promise, perhaps resolve(null)
would be appropriate in your case.
I think it should work, but it is not reaching to next.then()
.
– Rupesh
Nov 23 '18 at 20:37
1
@Rupesh It should work if you copy my code exactly as I said. Yourresolve()
call in yourrelatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the nextthen
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.
– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
add a comment |
This happens when the promise has not been resolved, so your resolve function isn't being called. It would probably be a good idea to test this without the below conditional.
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53452512%2fpromises-returned-data-pending%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
It happens because you assign the promise returned by relatedVideos()
to the property relatedVideos
, you never actually wait for it to resolve. You need to await all of the promises before you proceed, this is most easily done with Promise.all()
. Let's focus on this part of your code:
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
What you need to do is to wait for each promise to resolve in order to get its resolved value before you assign it to the object. Then you also need to create a promise that doesn't resolve until all of those promises have resolved. This is what Promise.all()
is for. Change the code mentioned above into this:
return Promise.all(result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
return relatedVideos(el.id)
.then(function(relatedVideo) {
o.relatedVideos = relatedVideo;
return o;
});
}));
Please note that ALL of the promises mapped to Promise.all()
needs to resolve in order for the chain to continue with the next then
. If even one of those promises rejects or don't resolve at all it will never continue. You have a condition for your resolve()
call in the relatedVideos()
function. This implies that in some cases a promise might end up never resolving. You should always resolve or reject a promise, perhaps resolve(null)
would be appropriate in your case.
I think it should work, but it is not reaching to next.then()
.
– Rupesh
Nov 23 '18 at 20:37
1
@Rupesh It should work if you copy my code exactly as I said. Yourresolve()
call in yourrelatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the nextthen
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.
– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
add a comment |
It happens because you assign the promise returned by relatedVideos()
to the property relatedVideos
, you never actually wait for it to resolve. You need to await all of the promises before you proceed, this is most easily done with Promise.all()
. Let's focus on this part of your code:
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
What you need to do is to wait for each promise to resolve in order to get its resolved value before you assign it to the object. Then you also need to create a promise that doesn't resolve until all of those promises have resolved. This is what Promise.all()
is for. Change the code mentioned above into this:
return Promise.all(result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
return relatedVideos(el.id)
.then(function(relatedVideo) {
o.relatedVideos = relatedVideo;
return o;
});
}));
Please note that ALL of the promises mapped to Promise.all()
needs to resolve in order for the chain to continue with the next then
. If even one of those promises rejects or don't resolve at all it will never continue. You have a condition for your resolve()
call in the relatedVideos()
function. This implies that in some cases a promise might end up never resolving. You should always resolve or reject a promise, perhaps resolve(null)
would be appropriate in your case.
I think it should work, but it is not reaching to next.then()
.
– Rupesh
Nov 23 '18 at 20:37
1
@Rupesh It should work if you copy my code exactly as I said. Yourresolve()
call in yourrelatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the nextthen
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.
– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
add a comment |
It happens because you assign the promise returned by relatedVideos()
to the property relatedVideos
, you never actually wait for it to resolve. You need to await all of the promises before you proceed, this is most easily done with Promise.all()
. Let's focus on this part of your code:
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
What you need to do is to wait for each promise to resolve in order to get its resolved value before you assign it to the object. Then you also need to create a promise that doesn't resolve until all of those promises have resolved. This is what Promise.all()
is for. Change the code mentioned above into this:
return Promise.all(result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
return relatedVideos(el.id)
.then(function(relatedVideo) {
o.relatedVideos = relatedVideo;
return o;
});
}));
Please note that ALL of the promises mapped to Promise.all()
needs to resolve in order for the chain to continue with the next then
. If even one of those promises rejects or don't resolve at all it will never continue. You have a condition for your resolve()
call in the relatedVideos()
function. This implies that in some cases a promise might end up never resolving. You should always resolve or reject a promise, perhaps resolve(null)
would be appropriate in your case.
It happens because you assign the promise returned by relatedVideos()
to the property relatedVideos
, you never actually wait for it to resolve. You need to await all of the promises before you proceed, this is most easily done with Promise.all()
. Let's focus on this part of your code:
return result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
o.relatedVideos = relatedVideos(el.id); //function is called below
return o;
});
What you need to do is to wait for each promise to resolve in order to get its resolved value before you assign it to the object. Then you also need to create a promise that doesn't resolve until all of those promises have resolved. This is what Promise.all()
is for. Change the code mentioned above into this:
return Promise.all(result.map(function(el) {
// console.log(el);
let o = Object.assign({}, el);
return relatedVideos(el.id)
.then(function(relatedVideo) {
o.relatedVideos = relatedVideo;
return o;
});
}));
Please note that ALL of the promises mapped to Promise.all()
needs to resolve in order for the chain to continue with the next then
. If even one of those promises rejects or don't resolve at all it will never continue. You have a condition for your resolve()
call in the relatedVideos()
function. This implies that in some cases a promise might end up never resolving. You should always resolve or reject a promise, perhaps resolve(null)
would be appropriate in your case.
edited Nov 23 '18 at 20:57
answered Nov 23 '18 at 20:30
LennholmLennholm
4,4211823
4,4211823
I think it should work, but it is not reaching to next.then()
.
– Rupesh
Nov 23 '18 at 20:37
1
@Rupesh It should work if you copy my code exactly as I said. Yourresolve()
call in yourrelatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the nextthen
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.
– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
add a comment |
I think it should work, but it is not reaching to next.then()
.
– Rupesh
Nov 23 '18 at 20:37
1
@Rupesh It should work if you copy my code exactly as I said. Yourresolve()
call in yourrelatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the nextthen
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.
– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
I think it should work, but it is not reaching to next
.then()
.– Rupesh
Nov 23 '18 at 20:37
I think it should work, but it is not reaching to next
.then()
.– Rupesh
Nov 23 '18 at 20:37
1
1
@Rupesh It should work if you copy my code exactly as I said. Your
resolve()
call in your relatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the next then
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.– Lennholm
Nov 23 '18 at 20:42
@Rupesh It should work if you copy my code exactly as I said. Your
resolve()
call in your relatedVideos()
is conditional, if any of those promises don't resolve, it will never reach the next then
in the chain. Make sure they all resolve, you really need to do something with the promise when your condition isn't met.– Lennholm
Nov 23 '18 at 20:42
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
thanx, it works, there was the problem in the condition of 5 videos.
– Rupesh
Nov 23 '18 at 20:46
add a comment |
This happens when the promise has not been resolved, so your resolve function isn't being called. It would probably be a good idea to test this without the below conditional.
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
add a comment |
This happens when the promise has not been resolved, so your resolve function isn't being called. It would probably be a good idea to test this without the below conditional.
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
add a comment |
This happens when the promise has not been resolved, so your resolve function isn't being called. It would probably be a good idea to test this without the below conditional.
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
This happens when the promise has not been resolved, so your resolve function isn't being called. It would probably be a good idea to test this without the below conditional.
if(relatedVideos.length === 5){
resolve(relatedVideos);
}
answered Nov 23 '18 at 20:25
Travis MTravis M
1737
1737
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
add a comment |
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
I checked This is not a problem.
– Rupesh
Nov 23 '18 at 20:29
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
And you're certain that resolve is being called?
– Travis M
Nov 23 '18 at 20:30
you were right .
– Rupesh
Nov 23 '18 at 20:45
you were right .
– Rupesh
Nov 23 '18 at 20:45
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53452512%2fpromises-returned-data-pending%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown