この質問が愚かであれば申し訳ありません。
このコードは正しく動作します。そして、すべての約束が正常に解決された後で、データ変数をエクスポートする必要があります。
このコードを関数に追加して変数をエクスポートすることはできません。この場合、この関数は空の配列をエクスポートするためです。
'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!
// 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: 提案されたトップレベルawait
が表示されるまで、値をエクスポートする前に待つだけです。
今日あなたはします
const wait = ms => new Promise(r => setTimeout(() => r(), ms))
async function foo() {
console.log('called')
await wait(1000)
return 'hi'
}
export default foo()
import foo from './foo'
void (async function() {
console.log(foo)
console.log(await foo)
console.log(await foo)
})()
> called
> Promise { <pending> }
> hi
> hi
開始時にデータをフェッチすると便利です
エクスポート元のモジュールでプロミスを解決するだけでプロミス結果をエクスポートでき、then()ブロックでexports.variable_name = promiseResult;を使用します。
例:アプリ全体でデータベース接続を使用したい。しかし、接続呼び出しは私に約束を返します。それで、promise.thenを呼び出してブロックし、希望する結果をエクスポートします。 Connection.jsファイル
async function connect() {
connection = await oracledb.getConnection(config)
if (connection) {
return connection;
} else {
return null;
}
}
connect().then((res) => {
exports.connection = res;
});
次にmain.jsファイルで、単にconnection.jsファイルを必要とします。
ただし、プロミスが失敗したり解決に時間がかかりすぎたり、プロミスが解決される前にどこかで使用されたりすると、エラーが発生する可能性があるため、これは良い方法ではありません。