How can I export promise result?

时光总嘲笑我的痴心妄想 提交于 2019-12-01 14:29:21

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!