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)
}
}
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
.
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)))