web-dev-qa-db-fra.com

Quelle est la bonne façon de gérer les appels d'attente asynchrones imbriqués dans Node?

Essayer d'apprendre le modèle asynchrone en Javascript mais il ne semble pas qu'il attend la ligne suivante. Dans l'exemple suivant, la collection est l'objet de demande et non le corps analysé réel. await n'est-il pas censé attendre la fin de la demande?

async function importUsers(endpoint) {
    const options = {
        data: search,
        uri: endpointCollection,
        headers,
    }

    try {
        const collection = await browser.post(options, (err, res, body) => JSON.parse(body))
        // collection is the request object instead of the result of the request
        const users = await collection.data.forEach(item => parseUserProfile(item));

        await users.forEach(user => saveUserInfo(user))
    } catch(err) {
        handleError(err)
    }
}



async function parseUserProfile({ username, userid }) {
    const url = userProfileString(username)

    try {
        const profile = await browser.get(url, headers, (err, res, body) => {   
            return { ... } // data from the body
        })
    } catch(err) {
        handleError(err)
    }
}
14
user3162553

Async/Await ne fonctionne que sur les fonctions qui renvoient (et résolvent) une promesse.

L'exemple suivant écrit sur la console après 3 secondes, puis continue.

// Tell the browser that this function is asynchronous
async function myFunc() {
    // Await for the promise to resolve
    await new Promise((resolve) => {
        setTimeout(() => {
            // Resolve the promise
            resolve(console.log('hello'));
        }, 3000);
    });
    // Once the promise gets resolved continue on
    console.log('hi');
}

// Call the function
myFunc();

Sans async/wait, la sortie serait la suivante:

hi
hello

Voici un exemple sans async/wait:

// Tell the browser that this function is asynchronous
async function myFunc() {
    // Skip await
    new Promise((resolve) => {
        setTimeout(() => {
            // Resolve the promise
            resolve(console.log('hello'));
        }, 3000);
    });
    // Since await was not used, this will print first
    console.log('hi');
}

// Call the function
myFunc();

Ce serait parce que la sortie hi s'exécuterait, puis après 3 secondes, le délai d'expiration s'exécuterait.

Mais avec async/wait, la sortie ressemble à ceci:

hello
hi

C'est parce que nous attendons le délai d'attente, puis nous exécutons la sortie hi.

10
Get Off My Lawn

await devrait attendre une promesse, pour une fonction asynchrone de style de rappel, vous pouvez la transformer comme:

new Promise((resolve, reject) => browser.post(options, (err, res, body) => resolve(JSON.parse(body))))

Pour un tableau, vous devez le mapper à un tableau de promesses, puis utilisez Promise.all pour le transformer en une "promesse de tableau", par exemple:

Promise.all(collection.data.map(item => parseUserProfile(item)))
4
Sheng