Javascript code executing out of order, can I fix it?
I am trying to get this piece of code to work and it seems to be running out of order. I noticed this in the console logs.
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
It seems that the code is running console.log('url outside of function is: '+urlimage); before it runs console.log(urlimage);
I am not too familiar with Javascript yet and I hope I can get some help with this one.
Thanks!!!
javascript html
add a comment |
I am trying to get this piece of code to work and it seems to be running out of order. I noticed this in the console logs.
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
It seems that the code is running console.log('url outside of function is: '+urlimage); before it runs console.log(urlimage);
I am not too familiar with Javascript yet and I hope I can get some help with this one.
Thanks!!!
javascript html
1
It's because of async! Use another.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21
add a comment |
I am trying to get this piece of code to work and it seems to be running out of order. I noticed this in the console logs.
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
It seems that the code is running console.log('url outside of function is: '+urlimage); before it runs console.log(urlimage);
I am not too familiar with Javascript yet and I hope I can get some help with this one.
Thanks!!!
javascript html
I am trying to get this piece of code to work and it seems to be running out of order. I noticed this in the console logs.
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
It seems that the code is running console.log('url outside of function is: '+urlimage); before it runs console.log(urlimage);
I am not too familiar with Javascript yet and I hope I can get some help with this one.
Thanks!!!
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
<script>
var wrapper = document.getElementById("myHTMLWrapper");
var myHTML = '';
var databaseRef = firebase.database().ref('items/');
databaseRef.once('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = '';
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
console.log('url outside of function is: '+urlimage);
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
console.log('images/'+ childData.id +'.jpg');
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
});
wrapper.innerHTML = myHTML;
});
</script>
javascript html
javascript html
asked Nov 25 '18 at 21:12
J WJ W
135
135
1
It's because of async! Use another.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21
add a comment |
1
It's because of async! Use another.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21
1
1
It's because of async! Use another
.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21
It's because of async! Use another
.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21
add a comment |
3 Answers
3
active
oldest
votes
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
The piece of code above from the code you provided actually uses Promises. You usually use promises when dealing with asynchronous data, for example, data from a server. While that piece of code is processing, other lines of code are being executed, thereby leading to what you are observing. The behavior of asynchronous code cannot be usually predicted.
To use urlimage
you can do something like this.
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
});
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning withmyHTML +=
inside the promise's function
– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
add a comment |
You have asynchronous code here. Looks like getDownloadURL()
is a promise. I don't know what that function do (google says it is from firebase), but it comes from external library. And it can take some time to execute.
Even if it takes few milliseconds. It is always moved at the end of event loop.
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
add a comment |
getDownloadURL().then(...)
looks like an asynchronous function to me. Asynchronous (async for short) means that the javascript makes an external request (e.g. download a file) and then executes a callback function (the argument to then
) once the external request is complete. In general you should expect javascript async callbacks to execute after the entire function call stack that starts the request.
Most programming languages with asynchronous functions will have a facility to wait, which is often called "blocking", but Javascript is an exception.
The reason Javascript does not permit blocking is Javascript engines are single threaded, so blocking on an operation blocks the whole system.
So for a long time, couldn't block a function to wait for the async calls to finish and pick up as if they were ordinary synchronous calls.
This is so inconvenient, Javascript eventually introduced async
functions and the await
keyword, which does what you want.
async function buildHtml(snapshot) {
// Note the novel for-loop syntax. The inner function in forEach would break async.
for(childSnapshot of snapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = await storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL(); // global state may change here
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
}
wrapper.innerHTML = myHTML;
}
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,await
. It's new, surprisingly.
– 01d55
Nov 28 '18 at 4:58
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%2f53472038%2fjavascript-code-executing-out-of-order-can-i-fix-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
The piece of code above from the code you provided actually uses Promises. You usually use promises when dealing with asynchronous data, for example, data from a server. While that piece of code is processing, other lines of code are being executed, thereby leading to what you are observing. The behavior of asynchronous code cannot be usually predicted.
To use urlimage
you can do something like this.
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
});
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning withmyHTML +=
inside the promise's function
– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
add a comment |
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
The piece of code above from the code you provided actually uses Promises. You usually use promises when dealing with asynchronous data, for example, data from a server. While that piece of code is processing, other lines of code are being executed, thereby leading to what you are observing. The behavior of asynchronous code cannot be usually predicted.
To use urlimage
you can do something like this.
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
});
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning withmyHTML +=
inside the promise's function
– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
add a comment |
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
The piece of code above from the code you provided actually uses Promises. You usually use promises when dealing with asynchronous data, for example, data from a server. While that piece of code is processing, other lines of code are being executed, thereby leading to what you are observing. The behavior of asynchronous code cannot be usually predicted.
To use urlimage
you can do something like this.
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
});
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
urlimage = url;
console.log(urlimage);
});
The piece of code above from the code you provided actually uses Promises. You usually use promises when dealing with asynchronous data, for example, data from a server. While that piece of code is processing, other lines of code are being executed, thereby leading to what you are observing. The behavior of asynchronous code cannot be usually predicted.
To use urlimage
you can do something like this.
storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
});
answered Nov 25 '18 at 21:31
zezezeze
236
236
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning withmyHTML +=
inside the promise's function
– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
add a comment |
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning withmyHTML +=
inside the promise's function
– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
Thank you. I just tried your solution but it seems that now it just skips the myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">'; until the end. Is there any way I can wait for the promise to resolve before proceeding?
– J W
Nov 25 '18 at 21:38
You can also include the other lines of codes too. Those beginning with
myHTML +=
inside the promise's function– zeze
Nov 25 '18 at 21:51
You can also include the other lines of codes too. Those beginning with
myHTML +=
inside the promise's function– zeze
Nov 25 '18 at 21:51
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
Thanks. I've done that and not it seems to delay the entire myHTML string concatenation to a point where wrapper.innerHTML is storing an empty myHTML. Is there anything I can do to delay the execution of the rest of the javascript code? Thanks a bunch for your time and expertise.
– J W
Nov 25 '18 at 22:01
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
You could delay the execution using setTimeout but that is definitely not the right way to go. I think the whole code needs restructuring but I cannot figure out how to do that yet especially with the fact that I'm not so familiar with firebase.
– zeze
Nov 25 '18 at 22:41
add a comment |
You have asynchronous code here. Looks like getDownloadURL()
is a promise. I don't know what that function do (google says it is from firebase), but it comes from external library. And it can take some time to execute.
Even if it takes few milliseconds. It is always moved at the end of event loop.
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
add a comment |
You have asynchronous code here. Looks like getDownloadURL()
is a promise. I don't know what that function do (google says it is from firebase), but it comes from external library. And it can take some time to execute.
Even if it takes few milliseconds. It is always moved at the end of event loop.
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
add a comment |
You have asynchronous code here. Looks like getDownloadURL()
is a promise. I don't know what that function do (google says it is from firebase), but it comes from external library. And it can take some time to execute.
Even if it takes few milliseconds. It is always moved at the end of event loop.
You have asynchronous code here. Looks like getDownloadURL()
is a promise. I don't know what that function do (google says it is from firebase), but it comes from external library. And it can take some time to execute.
Even if it takes few milliseconds. It is always moved at the end of event loop.
answered Nov 25 '18 at 21:22
kotletkotlet
16218
16218
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
add a comment |
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
the wording always doesn't suit with async.
– Bhojendra Rauniyar
Nov 25 '18 at 21:23
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
add a comment |
getDownloadURL().then(...)
looks like an asynchronous function to me. Asynchronous (async for short) means that the javascript makes an external request (e.g. download a file) and then executes a callback function (the argument to then
) once the external request is complete. In general you should expect javascript async callbacks to execute after the entire function call stack that starts the request.
Most programming languages with asynchronous functions will have a facility to wait, which is often called "blocking", but Javascript is an exception.
The reason Javascript does not permit blocking is Javascript engines are single threaded, so blocking on an operation blocks the whole system.
So for a long time, couldn't block a function to wait for the async calls to finish and pick up as if they were ordinary synchronous calls.
This is so inconvenient, Javascript eventually introduced async
functions and the await
keyword, which does what you want.
async function buildHtml(snapshot) {
// Note the novel for-loop syntax. The inner function in forEach would break async.
for(childSnapshot of snapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = await storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL(); // global state may change here
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
}
wrapper.innerHTML = myHTML;
}
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,await
. It's new, surprisingly.
– 01d55
Nov 28 '18 at 4:58
add a comment |
getDownloadURL().then(...)
looks like an asynchronous function to me. Asynchronous (async for short) means that the javascript makes an external request (e.g. download a file) and then executes a callback function (the argument to then
) once the external request is complete. In general you should expect javascript async callbacks to execute after the entire function call stack that starts the request.
Most programming languages with asynchronous functions will have a facility to wait, which is often called "blocking", but Javascript is an exception.
The reason Javascript does not permit blocking is Javascript engines are single threaded, so blocking on an operation blocks the whole system.
So for a long time, couldn't block a function to wait for the async calls to finish and pick up as if they were ordinary synchronous calls.
This is so inconvenient, Javascript eventually introduced async
functions and the await
keyword, which does what you want.
async function buildHtml(snapshot) {
// Note the novel for-loop syntax. The inner function in forEach would break async.
for(childSnapshot of snapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = await storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL(); // global state may change here
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
}
wrapper.innerHTML = myHTML;
}
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,await
. It's new, surprisingly.
– 01d55
Nov 28 '18 at 4:58
add a comment |
getDownloadURL().then(...)
looks like an asynchronous function to me. Asynchronous (async for short) means that the javascript makes an external request (e.g. download a file) and then executes a callback function (the argument to then
) once the external request is complete. In general you should expect javascript async callbacks to execute after the entire function call stack that starts the request.
Most programming languages with asynchronous functions will have a facility to wait, which is often called "blocking", but Javascript is an exception.
The reason Javascript does not permit blocking is Javascript engines are single threaded, so blocking on an operation blocks the whole system.
So for a long time, couldn't block a function to wait for the async calls to finish and pick up as if they were ordinary synchronous calls.
This is so inconvenient, Javascript eventually introduced async
functions and the await
keyword, which does what you want.
async function buildHtml(snapshot) {
// Note the novel for-loop syntax. The inner function in forEach would break async.
for(childSnapshot of snapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = await storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL(); // global state may change here
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
}
wrapper.innerHTML = myHTML;
}
getDownloadURL().then(...)
looks like an asynchronous function to me. Asynchronous (async for short) means that the javascript makes an external request (e.g. download a file) and then executes a callback function (the argument to then
) once the external request is complete. In general you should expect javascript async callbacks to execute after the entire function call stack that starts the request.
Most programming languages with asynchronous functions will have a facility to wait, which is often called "blocking", but Javascript is an exception.
The reason Javascript does not permit blocking is Javascript engines are single threaded, so blocking on an operation blocks the whole system.
So for a long time, couldn't block a function to wait for the async calls to finish and pick up as if they were ordinary synchronous calls.
This is so inconvenient, Javascript eventually introduced async
functions and the await
keyword, which does what you want.
async function buildHtml(snapshot) {
// Note the novel for-loop syntax. The inner function in forEach would break async.
for(childSnapshot of snapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
myHTML += '<div class="card">';
myHTML += '<div class="card-body">';
var urlimage = await storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL(); // global state may change here
myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
myHTML += '</div>';
myHTML += '</div>';
}
wrapper.innerHTML = myHTML;
}
edited Nov 28 '18 at 4:49
answered Nov 25 '18 at 21:22
01d5501d55
1,6041119
1,6041119
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,await
. It's new, surprisingly.
– 01d55
Nov 28 '18 at 4:58
add a comment |
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,await
. It's new, surprisingly.
– 01d55
Nov 28 '18 at 4:58
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
Thank you for answering. That does seem to be the issue. Is there any way I can wait for the callback function to resolve before proceeding?
– J W
Nov 25 '18 at 21:33
@JW yes,
await
. It's new, surprisingly.– 01d55
Nov 28 '18 at 4:58
@JW yes,
await
. It's new, surprisingly.– 01d55
Nov 28 '18 at 4:58
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%2f53472038%2fjavascript-code-executing-out-of-order-can-i-fix-it%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
1
It's because of async! Use another
.then()
– Bhojendra Rauniyar
Nov 25 '18 at 21:21