问题
Sorry if this question is stupid.
This code works correctly. And I just need to export data variable after all promises successfully resolved.
I cannot put this code to function and export variable. Because in this case, this function will export an empty array.
'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))
回答1:
You could easily assign it to an exported variable, but you should not do that - the assignment happens asynchronously, and the variable might be read before that in the modules where it is imported.
So instead, just export the promise1!
// 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: Until the proposed top-level await comes along and you can just wait for the value before exporting it.
回答2:
Nowadays u do
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)
})()
output
> called
> Promise { <pending> }
> hi
> hi
It's usefull to fetch datas at start
回答3:
You can export your promise result by simply resolving the promise in the module from which to want to export, and in then() block use exports.variable_name = promiseResult;
For example: I want to use a database connection in my whole app. but the connect call return me a promise. so I can simply call the promise.then and i then block, export my desired result. Connection.js file
async function connect() {
connection = await oracledb.getConnection(config)
if (connection) {
return connection;
} else {
return null;
}
}
connect().then((res) => {
exports.connection = res;
});
then in main.js file, just simply require the connection.js file.
But this is not good practice because if your promise fails or take too much time to resolve, and it is used somewhere before it was resolved, may cause errors.
来源:https://stackoverflow.com/questions/42958334/how-can-i-export-promise-result