Nodejs中async函数里的await为什么不起作用,总是返回undefined?
Nodejs中async函数里的await为什么不起作用,总是返回undefined?
代码如下:
async function test_async ( ) {
var test_array = [ “a” , “b” , “c” ] ;
( function iterator ( city_number ) {
if ( url_array [ city_number ].pathname == “/4401” ) {
// if ( test_array.length == 3 ) {
return “DD” ;
/*
//to do something.
return new Promise ( function ( resolve, reject ) {
resolve ( “dd” ) ;
} ) ;
*/
}
iterator ( city_number + 1 ) ; // 迭代调用 函数自身, 执行下一个循环 ;
});
}
async function Get_data ( ) {
var temp_Variable = await test_async ( ) ;
console.log ( temp_Variable ) ;
}
Get_data ( ) ;
在 win10 平台下的 node.js ,CMD 中执行 文件后,总是 返回 undefined。
顺带问下,不知道 V2 怎么粘贴代码格式,帖子没有显示缩进,有人说下怎么做吗?
排版能不能调整下
你 promise 被注释掉了啊,而且 iterator 放()里什么目的,立即执行函数?那你后面要加()啊
请问怎么调整啊?我在发帖提示那找了下没找到说明
我在 function test_async ( ) { 前面加了 async 啊,不是说加了 async 会隐式返回 promise ,所以我注释掉了显示的 promise,然后进行测试;
另外,我是执行 Get_data(),然后 Get_data 调用 test_async
iterator 括起来是什么意思?
抱歉,代码贴错了,我改了一下:
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
循环迭代应该没有问题吧?
抱歉,代码贴错了,我改了一下:
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 ,在我原本得项目里面,迭代是油执行的。
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 ( ) ;
应该是改成这样吧?
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();
你的 test_async 没有返回值,相当于 Promise.resolve().then(temp_Variable => console.log(temp_Variable)); temp_Variable 是 undefined。你的 iterator 是立即执行函数,有自己的作用域,参考 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
谢谢你的代码,我自己这条一下午也没有搞明白
请问你的代码里面 function iterator(i) 是不是相当于是 闭包了?
代码有两处错误
iterator(i + 1)
这一句当进行递归时,要把下一次递归的返回值作为本次函数的返回值,这样递归结束才能层层返回
改成这样
return iterator(i + 1)
第二处 #10 已经指明了,async 函数的返回值如果不是 promise,会被隐式包装为 promise。但是注意,你的 asnyc test_async() 并没有显式返回,那么被包装的其实是 undefined,再次 await 后得到的只能是这个 undefined
另外 (function(){})() 结构一般叫做立即执行函数,把这个叫闭包是讹传
贴代码用 markdown 语法,在发帖时有效,回帖不能用 markdown
谢谢你的指导
感谢楼上各位的指导,问题解决,分享两个解决方案
第一个是
的办法,采用 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();
在Node.js中,如果你发现async
函数里的await
不起作用,总是返回undefined
,这通常意味着你await
的表达式本身返回的就是undefined
,或者你的使用方式有误。以下是一些可能的原因及解决方法:
-
确保被
await
的表达式有返回值: 确保你await
的是一个Promise,并且这个Promise最终会resolve一个非undefined
的值。async function fetchData() { return new Promise((resolve) => { setTimeout(() => resolve("data"), 1000); }); } async function main() { const data = await fetchData(); console.log(data); // 应该输出 "data" } main();
-
检查是否有语法错误: 确保
await
是在async
函数内部使用,且表达式正确。 -
检查Promise的实现: 如果你
await
的是自己实现的Promise,检查Promise的resolve部分是否确实传递了值。 -
避免在顶层代码中使用
await
: 在顶层代码(如直接在脚本中而非函数内)使用await
可能会导致问题,因为顶层代码不是异步函数。 -
调试和日志: 在
await
表达式前后添加console.log
来检查执行流程和返回值。
如果以上都确认无误,但问题依旧,请检查你的Node.js版本,确保它支持你正在使用的ES特性。此外,查看是否有其他异步逻辑干扰了await
的执行。