web-dev-qa-db-fra.com

Comment puis-je exporter le résultat promis?

Désolé si cette question est stupide.

Ce code fonctionne correctement. Et j'ai juste besoin d'exporter la variable de données une fois toutes les promesses résolues.

Je ne peux pas mettre ce code en fonction et exporter une variable. Parce que dans ce cas, cette fonction exportera un tableau vide.

'use strict'

import urls from './urls'
import getData from './get-data'

getData(urls).then((responses) => {
    const data = []
    const results = responses.map(JSON.parse)

    for (let i = 0, max = results.length; i < max; i++) {
        // some magic and pushing 
    }

    return data
}).catch(error => console.log(error))
14
Entry Guy

Vous pouvez facilement l'affecter à une variable exportée, mais vous ne devriez pas le faire - l'affectation se produit de manière asynchrone et la variable peut être lue avant cela dans les modules où elle est importée.

Donc, à la place, exportez simplement la promesse1!

// data.js
import urls from './urls'
import getData from './get-data'

export default getData(urls).then(responses =>
    responses.map(JSON.parse).map(magic)
);
// main.js
import dataPromise from './data'

dataPromise.then(data => {
    console.log(data);
    …
}, console.error);

1: Jusqu'à ce que le niveau supérieur proposé await arrive et vous pouvez simplement attendre la valeur avant de l'exporter.

11
Bergi

De nos jours tu fais

foo.js

const wait = ms => new Promise(r => setTimeout(() => r(), ms))

async function foo() {
    console.log('called')
    await wait(1000)
    return 'hi'
}

export default foo()

index.js

import foo from './foo'

void (async function() {
    console.log(foo)
    console.log(await foo)
    console.log(await foo)
})()

production

> called
> Promise { <pending> }
> hi
> hi

Il est utile de récupérer des données au début

2
Sceat

Vous pouvez exporter le résultat de votre promesse en résolvant simplement la promesse dans le module à partir duquel exporter, puis dans le bloc then (), utilisez exports.variable_name = promiseResult;

Par exemple: je souhaite utiliser une connexion à une base de données dans l'ensemble de mon application. mais l'appel de connexion me renvoie une promesse. Je peux donc simplement appeler la promesse.Ensuite, je bloque, exporte le résultat souhaité. Fichier Connection.js

async function connect() {
    connection = await oracledb.getConnection(config)
if (connection) {
    return connection;
} else {
    return null;
  }
}

connect().then((res) => {
    exports.connection = res;
});

puis dans le fichier main.js, il vous suffit de demander le fichier connection.js.

Mais ce n'est pas une bonne pratique, car si votre promesse échoue ou prend trop de temps à résoudre, et qu'elle est utilisée quelque part avant d'être résolue, cela peut provoquer des erreurs.

0
zubair Irfan