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出现之前,您可以在导出之前等待该值.
编辑 2021
由于节点现在支持top-level-await解决方案是非常基本的
export await new Promise()
Run Code Online (Sandbox Code Playgroud)
import foo from './foo.js' // the import wait for the promise to be resolved
console.log(foo)
Run Code Online (Sandbox Code Playgroud)
现在你做
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)
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)
在开始时获取数据很有用