很抱歉,如果这个问题很愚蠢。
此代码正常运行。在成功解决所有承诺后,我只需要导出数据变量。
我无法将此代码用于函数和导出变量。因为在这种情况下,此函数将导出一个空数组。
'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))
答案 0 :(得分:8)
您可以轻松地将其分配给导出的变量,但不应该这样做 - 分配是异步发生的,并且在导入变量的模块中可能会先读取变量。
相反,只需导出promise 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:在proposed top-level await
出现之前,您可以在导出之前等待该值。
答案 1 :(得分:1)
今天你要做
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
在开始时获取数据很有用
答案 2 :(得分:0)
您可以通过简单地在要从中导出的模块中解析promise来导出promise结果,然后在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文件。
但这不是一个好习惯,因为如果您的诺言失败或花费了太多时间来解决,并且在解决诺言之前使用了诺言,则可能会导致错误。
答案 3 :(得分:0)
您应该使用Promise函数
promise.js
export function get_data(){
var get_data= new Promise(function(resolve, reject) {
//do your stuff
return resolve('success');
}).catch(function () {
return reject('err');
});
});
//return promise
return get_data;
}
导入
import * as data from './mypromise'
data.get_data().then((reuslt)=>{
console.log(result)})