如何导出承诺结果?

Ent*_*Guy 11 javascript promise es6-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))
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 12

您可以轻松地将其分配给导出的变量,但是您不应该这样做 - 分配是异步发生的,并且可以在导入变量的模块中读取变量.

所以相反,只需输出承诺1!

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

export default getData(urls).then(responses =>
    responses.map(JSON.parse).map(magic)
);
Run Code Online (Sandbox Code Playgroud)

// main.js
import dataPromise from './data'

dataPromise.then(data => {
    console.log(data);
    …
}, console.error);
Run Code Online (Sandbox Code Playgroud)

1:在建议的顶级await出现之前,您可以在导出之前等待该值.

  • 我期待着顶级的等待! (3认同)

Sce*_*eat 5

编辑 2021

节点 > 14.3

由于节点现在支持top-level-await解决方案是非常基本的

foo.js

export await new Promise()
Run Code Online (Sandbox Code Playgroud)

索引.js

import foo from './foo.js' // the import wait for the promise to be resolved

console.log(foo) 
Run Code Online (Sandbox Code Playgroud)

节点 14.3 以下

现在你做

foo.js

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

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

export default foo()
Run Code Online (Sandbox Code Playgroud)

索引.js

import foo from './foo'

void (async function() {
    console.log(foo)
    console.log(await foo)
    console.log(await foo)
})()
Run Code Online (Sandbox Code Playgroud)

输出

> called
> Promise { <pending> }
> hi
> hi
Run Code Online (Sandbox Code Playgroud)

在开始时获取数据很有用