What is the best approach to ensure that a loop is completed within an async function before moving on to execute code in another async function?

I am facing a scenario where I have an asynchronous function that iterates through an array of files for uploading. I also have another function responsible for submitting the final form, but it needs to ensure that all uploads are complete before proceeding.

methods: {
async selectFile() {
    for (let i = 0; i < this.Form.PostFiles.length; i++) {
        const File = this.Form.PostFiles[i][0];
        await this.uploadFile(File).then(response => {

        }).catch(error => {
        })

    }
},
async uploadFile(File) {
                const FormFile = new FormData();
                FormFile.append("PostFile", File);

                await this.$axios.post('/api', FormFile).then(response => {
                    console.log("Successfully uploaded")
                }).catch(err => {
                    console.log(err.response.data.error)
                })

      },
async sendForm() {
            const FormBody = new FormData();
            FormBody.append("Name", this.Form.Name);
            FormBody.append("Description", this.Form.Description);
            // Here I need to wait for all files to upload first!
            await this.selectFile; // But this fulfills on first iteration of for loop
            // If all files uploaded then post the form
            await this.$axios.post('/api', FormBody)
      }
}

The challenge with the current code is that the await this.selectFile statement in sendForm() resolves as soon as one iteration of the for loop in selectFile() finishes. To address this, I want to find a way for sendForm() to wait until the entire loop completes before sending the form. Any thoughts on how I can modify the code to achieve this?

It appears that the for loop needs some sort of wrapping mechanism to signal to sendForm() when it's safe to proceed with form submission after all files have been uploaded. I'm struggling to figure out the best approach to implement this logic.

Answer №1

To achieve the desired outcome, simply modify your method as shown below:

async selectFile() {
  await Promise.all(
      this.Form.PostFiles.map(async(el, i) => {
         const File = this.Form.PostFiles[i][0];
         await this.uploadFile(File)             
    })
  );
}

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

The Bootstrap modal window refuses to shut down

In my React application, I am utilizing Bootstrap modal functionality. One specific requirement is that the modal window should remain open when clicking on the modal backdrop. To achieve this, I have implemented the following code: $(".modal").modal({"ba ...

Tips on interpreting JSON objects and cross-referencing them with user input

I am currently developing an application where specific values are stored in JSON format and I aim to access these values through indexes rather than hard coding them. Below is a snippet of my HTML file combined with JavaScript: <html> <head> ...

Using Three.js BVHLoader in React/React Native applications

I am currently working on developing an application or website for displaying BVH animation. I came across a BVHLoader example in Three.js that I found interesting: BVHLoader example. I am aware that React and React Native can be used with Three.js as we ...

Changing the `$location.path` updates the URL without triggering a redirect

When I try to redirect to another page by clicking a button or a link, the URL changes but the redirection doesn't happen. I have to manually refresh the page with the new URL. I'm not sure if the issue lies in the module or the controller. loca ...

Utilizing v-model for dynamic binding within a v-for iteration

I'm currently working on binding v-model dynamically to an object property within an array of objects. I am unsure about how to accomplish this task. The objective is to choose a user using the Select HTML tag and then display the list of that user&ap ...

Is there a similar alternative to ignoring in webpack or browserify?

My code works perfectly in the browser after ignoring two packages with browserify: browserify files.js -i fs-extra -i request --standalone files > files.browserify.js. However, when I try to use webpack instead, the code throws errors about missing mod ...

Can someone please provide a reference to an online illustration of implementing TinyMCE with a print format similar to Microsoft Word

Are there any online resources demonstrating the use of TinyMCE with a print layout resembling Word, with visible page breaks? Alternatively, are there any other WYSIWYG editors with a built-in print layout feature available for open source use? ...

Exploring byte array manipulation in node.js and techniques for data processing

Currently, I am faced with the challenge of retrieving a full byte array from a socket and then inserting it into a BLOB database without formatting the data. This is necessary as I specifically need to maintain the structure of the byte array. Initially, ...

Retrieve the information of the currently logged-in user on Discord using next-auth

Can anyone help me with extracting the banner and ID of the currently logged in user? Feel free to reach out at next@12 [email protected] I have successfully logged the profile details at the backend, but I'm facing issues pulling this informatio ...

Step-by-step guide to dynamically load Bootstrap tab panels through tab clicks

I have implemented Bootstrap tab panels on my website, as shown below: <!-- Nav tabs --> <ul class="nav nav-tabs" role="tablist"> <li role="presentation" class="active"><a href="#chartcontainer1" aria-controls="chartcontainer1" role ...

The Sequelize findOne method fails to return the desired results, resulting in an empty

My findOne function with include is not working as expected. It is not returning any data. I am missing data for Deal, which is related to Redemption [] <- I should have data here. Deal.belongsTo(models.Redemption, { foreignKey: 'redemptionI ...

Transforming the MUI CircularProgress into a half circle shape

After utilizing CirculaProgress, I was able to achieve the following: https://i.sstatic.net/Y0Seo.png Is there a simple method to transform it into a semicircle like shown here? https://i.sstatic.net/D8bKu.png ...

Is there a way to determine if the items in an array are duplicated?

Hello all, as a beginner in coding, I'm looking for guidance on determining whether an array contains repeated objects regardless of their order, without knowing the specific objects in advance. Let's say: I initialize an empty array: var rando ...

Blocked: Stripe Connect Embedded Onboarding Popup

I have been diligently following the steps in the tutorial to set up Onboarding with Stripe Connect, which can be found at the following link: After completing all the necessary setup, I encountered an issue where the iFrame containing the "Add Informatio ...

Should the secret for express-session be a fixed value or should it change dynamically?

I'm uncertain whether the secret for this application should remain static or if it can be dynamic. Currently, I am setting the secret as follows: var salt1 = bcrypt.genSaltSync(); var salt2 = bcrypt.genSaltSync(); var secret = bcrypt.hashSync(salt1 ...

The ng-click event handler is not functioning

var myApp = angular.module('myApp', ['ngRoute']); myApp.config(function($routeProvider) { $routeProvider.when('/', { template: '', controller: 'DefaultController as dc' }).when('/rent& ...

Guide on Resolving AJAX Filtered Product List Issue with Missing Images in Django Ecommerce Website

I'm facing an issue while implementing filter functionality in my e-commerce project. When I utilized AJAX to generate a filtered product list, all the products are visible but the images aren't showing up. urls.py: urlpatterns = [ path(&apo ...

What is the best way to eliminate the Iframe scrollbar while ensuring that the entire page loads?

When I add an Iframe inside the contentArea, two scroll bars appear. I am looking for a way to hide the iframe scrollbar without hiding any of the external website's content. I have tried using the scrollbar="no" snippet code, but it didn&ap ...

Excessive geolocation position responses in Angular 5

I am trying to implement an Angular 5 component that will continuously fetch my current location every 3 seconds if it has changed. Here is a snippet of my code: export class WorkComponent implements OnInit { constructor(private userService: UserService ...

What is the best way to update a CSS class in React JS?

Suppose I have a CSS class called 'track-your-order' in my stylesheet. Whenever a specific event occurs, I need to modify the properties of this class and apply the updated values to the same div without toggling it. The goal is to replace the ex ...