1
salamanderMH 2019-06-18 21:00:58 +08:00
排版能不能调整下
|
2
kwrush 2019-06-18 21:07:29 +08:00
你 promise 被注释掉了啊,而且 iterator 放()里什么目的,立即执行函数?那你后面要加()啊
|
3
hgjian OP @salamanderMH 请问怎么调整啊?我在发帖提示那找了下没找到说明
|
4
hgjian OP @kwrush 我在 function test_async ( ) { 前面加了 async 啊,不是说加了 async 会隐式返回 promise ,所以我注释掉了显示的 promise,然后进行测试;
另外,我是执行 Get_data(),然后 Get_data 调用 test_async |
5
akmissxt 2019-06-18 21:47:38 +08:00
iterator 括起来是什么意思?
|
6
kwrush 2019-06-18 21:51:24 +08:00
@hgjian 你的 iterater 不会被执行,async 隐式返回 promise,但是你没给返回值,就 undefined 了
|
7
hgjian OP @akmissxt 抱歉,代码贴错了,我改了一下:
async function test_async ( ) { var test_array = [ "a" , "b" , "c" ] ; ( function iterator ( i ) { // if ( test_array [ i ] == "c" ) { if ( test_array.length == 3 ) { return "i" ; } iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; })(0); } async function Get_data ( ) { var temp_Variable = await test_async ( ) ; console.log ( temp_Variable ) ; } Get_data ( ) ; iterator 括起来是什么意思?===> 就是循环迭代 test_async 函数进行计算。 参考得如下网址: https://blog.csdn.net/birdflyto206/article/details/72627912?tdsourcetag=s_pctim_aiomsg 循环迭代应该没有问题吧? |
8
hgjian OP @kwrush 抱歉,代码贴错了,我改了一下:
async function test_async ( ) { var test_array = [ "a" , "b" , "c" ] ; ( function iterator ( i ) { // if ( test_array [ i ] == "c" ) { if ( test_array.length == 3 ) { return "i" ; } iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; })(0); } async function Get_data ( ) { var temp_Variable = await test_async ( ) ; console.log ( temp_Variable ) ; } Get_data ( ) ; 可以帮忙修改一下我参考一下吗? 我参考得 blog.csdn.net/birdflyto206/article/details/72627912?tdsourcetag=s_pctim_aiomsg ,在我原本得项目里面,迭代是油执行的。 |
9
hgjian OP async function test_async ( ) {
var test_array = [ "a" , "b" , "c" ] ; ( function iterator ( i ) { if ( test_array [ i ] == "c" ) { console.log ( i ) ; return i ; } iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; })(0); } async function Get_data ( ) { var temp_Variable = await test_async ( ) ; console.log ( temp_Variable ) ; } Get_data ( ) ; 应该是改成这样吧? |
10
rabbbit 2019-06-18 22:12:29 +08:00 1
async function test_async() {
....var test_array = ["a", "b", "c"]; ....return (function iterator(i) { ........// if ( test_array [ i ] == "c" ) { ........if (test_array.length == 3) { .............return "i"; ........} ........iterator(i + 1); // 迭代调用 函数自身, 执行下一个循环 ; ....})(0); } async function Get_data() { .....var temp_Variable = await test_async(); .....console.log(temp_Variable); } Get_data(); |
11
kwrush 2019-06-18 22:22:21 +08:00
@hgjian 你的 test_async 没有返回值,相当于 Promise.resolve().then(temp_Variable => console.log(temp_Variable)); temp_Variable 是 undefined。你的 iterator 是立即执行函数,有自己的作用域,参考 rabbbit 写法
|
12
hgjian OP @rabbbit 感谢,我原本的代码应该是下面的,原来的贴错了
....async function test_async ( ) { ........var test_array = [ "a" , "b" , "c" ] ; ........( function iterator ( i ) { ................if ( test_array [ i ] == "c" ) { ........................console.log ( i ) ; ........................return i ; ................} ................iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; ........} ) ( 0 ); ....} ....async function Get_data ( ) { ........var temp_Variable = await test_async ( ) ; ........console.log ( temp_Variable ) ; ....} ....Get_data ( ) ; 执行以后 ........console.log ( temp_Variable ) ; 显示的是 undefined |
16
autoxbc 2019-06-18 22:50:30 +08:00
代码有两处错误
iterator(i + 1) 这一句当进行递归时,要把下一次递归的返回值作为本次函数的返回值,这样递归结束才能层层返回 改成这样 return iterator(i + 1) 第二处 #10 已经指明了,async 函数的返回值如果不是 promise,会被隐式包装为 promise。但是注意,你的 asnyc test_async() 并没有显式返回,那么被包装的其实是 undefined,再次 await 后得到的只能是这个 undefined 另外 (function(){})() 结构一般叫做立即执行函数,把这个叫闭包是讹传 贴代码用 markdown 语法,在发帖时有效,回帖不能用 markdown |
18
hgjian OP 感谢楼上各位的指导,问题解决,分享两个解决方案
第一个是 @autoxbc 的办法,采用 return iterator(i + 1) 的方式。 async function test_async ( ) { var test_array = [ "a" , "b" , "c" ] ; return ( function iterator ( i ) { if ( test_array [ i ] == "c" ) { console.log ( "test_async ( ) 函数内部 " + i ) ; return i ; } return iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; } ) ( 0 ) ; } async function Get_data ( ) { console.log ( test_async ( ) ) ; var temp_Variable = await test_async ( ) ; console.log ( temp_Variable ) ; } Get_data ( ) ; 第二个是在 segmentfault 请教来的方案,借助一个中间变量实现: async function test_async ( ) { var test_array = ["a", "b", "c"] ; var a = null ; // 中间变量 ( function iterator ( i ) { if ( test_array [ i ] == "c" ) { a = i ; } else { iterator ( i + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ; } } ) ( 0 ) ; console.log ( "test_async() 函数内部 :" + a ) ; return a ; } async function Get_data() { console.log ( test_async ( ) ) ; var temp_Variable = await test_async ( ) ; console.log ( temp_Variable ) ; } Get_data(); |