web-dev-qa-db-ja.com

どうすればpromise結果をエクスポートできますか?

この質問が愚かであれば申し訳ありません。

このコードは正しく動作します。そして、すべての約束が正常に解決された後で、データ変数をエクスポートする必要があります。

このコードを関数に追加して変数をエクスポートすることはできません。この場合、この関数は空の配列をエクスポートするためです。

'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

エクスポートされた変数に簡単に割り当てることができますが、そうすることはできません。割り当ては非同期で行われ、変数はインポートされるモジュールでその前に読み取られる可能性があります。

代わりに、約束をエクスポートするだけです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 が表示されるまで、値をエクスポートする前に待つだけです。

11
Bergi

今日あなたはします

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

出力

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

開始時にデータをフェッチすると便利です

2
Sceat

エクスポート元のモジュールでプロミスを解決するだけでプロミス結果をエクスポートでき、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ファイルを必要とします。

ただし、プロミスが失敗したり解決に時間がかかりすぎたり、プロミスが解決される前にどこかで使用されたりすると、エラーが発生する可能性があるため、これは良い方法ではありません。

0
zubair Irfan