如何异步获取Promise内的值问题

tjhdaxia 2019-08-02 11:17:21

<script type="text/javascript">
function fn(){
//todo
return 123;
}

async function demo() {
let result = await Promise.resolve(fn());
console.log(result);
return result;
}
var test= demo();
console.log('test:',test);

</script>


打印的test的值为“test: Promise {<pending>}”
由于业务需要test必须直接得到123的值,如何改进,谢谢!




...全文
1004 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2019-08-02
  • 打赏
  • 举报
回复
引用 5 楼 tjhdaxia 的回复:
[quote=引用 3 楼 天际的海浪 的回复:]

<script type="text/javascript">
function fn(){
	//todo
	return 123;
}

async function demo() {
    let result = await Promise.resolve(fn());
	console.log(result);
	return result;
}
async function pf() {
	var test = await demo();
	console.log('test:',test);
}
pf();
</script>
多谢回复,有没有发现demo()里的写法已经和你的pf()的写法已经一样了,就是这样不行。 我需要从pf()直接获得返回的值,作为数据源给其它业务绑定。这样也无法使用。 我写一下简单的业务场景,即下面代码的combobox控件需要用到demo作为数据源来显示;当然我们可以通过demo().then(....)的方式来反向绑定此控件,但是实际业务比这个还复杂因此此方法不行,只能通过正向获得数据显示的方式来显示。

$('#cc').combobox({    
    data:demo()
    valueField:'id',    
    textField:'text'   
});  
[/quote] 你要知道,虽然await的调用从代码结构上看似乎是同步顺序执行,但实际上还是异步回调的执行机制。 async函数中await之后的代码就是异步回调的部分,只有执行了resolve,异步回调的部分才能执行。 也就是说能够等待的代码只是async函数(demo)中await之后的代码。async函数(demo)之外的代码不会等待。 如果需要调用demo()的地方也等待,就需要调用demo()的函数也是async函数,并用await来调用demo()。 以此类推,再外层的函数还需要等待,就也要改成async函数。

async function xxxxxx() {//$('#cc').combobox()所在的函数
	$('#cc').combobox({    
		    data: await demo(),
		    valueField:'id',    
		    textField:'text'   
	});  
}


zc_1994 2019-08-02
  • 打赏
  • 举报
回复
引用 6 楼 tjhdaxia 的回复:
[quote=引用 4 楼 zc_1994 的回复:] function fn(){ //todo return 123; } async function demo() { let result = await Promise.resolve(fn()); console.log(result); return result; } var test= demo(); test.then((res)=>{console.log(res)})
多谢回复,我需用demo()得到值给test,请看5楼我有写了简单的业务场景。[/quote] 这样呢 function fn(){ //todo return 123; } async function demo() { let result = await Promise.resolve(fn()); console.log(result); return result; } var test= await demo(); console.log(test)
tjhdaxia 2019-08-02
  • 打赏
  • 举报
回复
引用 4 楼 zc_1994 的回复:
function fn(){ //todo return 123; } async function demo() { let result = await Promise.resolve(fn()); console.log(result); return result; } var test= demo(); test.then((res)=>{console.log(res)})
多谢回复,我需用demo()得到值给test,请看5楼我有写了简单的业务场景。
tjhdaxia 2019-08-02
  • 打赏
  • 举报
回复
引用 3 楼 天际的海浪 的回复:

<script type="text/javascript">
function fn(){
	//todo
	return 123;
}

async function demo() {
    let result = await Promise.resolve(fn());
	console.log(result);
	return result;
}
async function pf() {
	var test = await demo();
	console.log('test:',test);
}
pf();
</script>
多谢回复,有没有发现demo()里的写法已经和你的pf()的写法已经一样了,就是这样不行。 我需要从pf()直接获得返回的值,作为数据源给其它业务绑定。这样也无法使用。 我写一下简单的业务场景,即下面代码的combobox控件需要用到demo作为数据源来显示;当然我们可以通过demo().then(....)的方式来反向绑定此控件,但是实际业务比这个还复杂因此此方法不行,只能通过正向获得数据显示的方式来显示。

$('#cc').combobox({    
    data:demo()
    valueField:'id',    
    textField:'text'   
});  
zc_1994 2019-08-02
  • 打赏
  • 举报
回复
function fn(){ //todo return 123; } async function demo() { let result = await Promise.resolve(fn()); console.log(result); return result; } var test= demo(); test.then((res)=>{console.log(res)})
天际的海浪 2019-08-02
  • 打赏
  • 举报
回复

<script type="text/javascript">
function fn(){
	//todo
	return 123;
}

async function demo() {
    let result = await Promise.resolve(fn());
	console.log(result);
	return result;
}
async function pf() {
	var test = await demo();
	console.log('test:',test);
}
pf();
</script>
tjhdaxia 2019-08-02
  • 打赏
  • 举报
回复
引用 1 楼 讨厌走开啦 的回复:
https://blog.csdn.net/lqlqlq007/article/details/96479546 看这里。
看过,需要写".then(...)"才可以,已经达不到要求,我需要直接返回123这个数据,原因是fun函数业务比较复杂写了好多个异步处理。

87,923

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧