我想从异步函数中获取状态,但它总是返回未定义的状态,而不是返回包含返回状态的函数;
main.js
let status = addData(firstname, lastname, age, sex);
console.log(status);
data.js
static async addData(firstname, lastname, age, sex) {
try {
let txdata = await data.dataentry(firstname, lastname, age, sex);
let count = 0;
let intervalId = setInterval(async() => {
let status = await data.entryStatus(txdata);
logger.info("status %o", status);
if (status = true) {
clearInterval(intervalId);
return status;
} else {
count++;
if (count > 4) {
clearInterval(intervalId);
throw createError();
}
}
}, 500);
} catch (err) {
throw createError();
}
}
答案 0 :(得分:1)
从异步函数返回结果的标准方法是使用Promise。 它与Attila描述的完全相似,但您不需要库来使用它。
它适用于所有现代浏览器和nodejs / iojs,所以如果你不关心Internet Explorer,它是我认为最好的选择。 如果您需要Internet Explorer,可以使用垫片。 " shim promise"在谷歌提供了几个选项,但我没有尝试任何选择。
答案 1 :(得分:-1)
不可能这样,因为你的函数将在异步任务完成之前返回。
您可以使用Observables。所以你的data.js可能是:
function adddata(firstname,lastname,age,sex) {
return Observable.create(observer => {
try {
let txdata = await data.dataentry(firstname,lastname,age,sex);
let count = 0;
let intervalId = setInterval(async () => {
let status = await data.entryStatus(txdata);
logger.info("status %o", status);
if (status = true) {
clearInterval(intervalId);
// here you can send whatever you want through the observable
observer.next(status);
observer.onCompleted();
} else {
count++;
if (count > 4) {
clearInterval(intervalId);
observer.error(createError());
}
}
}, 500);
} catch (err) {
observer.error(createError());
}
}
});
在你的main.js中你可以订阅:
adddata(firstname,lastname,age,sex).subscribe(result => {
// you will get your result here
console.log(result);
});