NodeJS中函数内部运行正常但外部返回undefined问题求解
问题根因
你遇到的是Node.js中异步I/O执行顺序的典型问题,核心原因如下:
fetch发起的网络请求属于异步非阻塞操作,调用后不会立刻返回结果,只会把后续的.then回调注册到任务队列,等主线程同步代码执行完、网络请求响应回来之后才会执行回调里的逻辑- 你的
getjsonname函数没有主动返回值,执行完fetch()调用后就会直接返回默认值undefined,外部console.log执行的时候,异步回调还没跑,所以拿到的就是undefined - 函数内部的
console.log是在异步回调里执行的,等网络请求回来之后才触发,所以能正常拿到json.name的值
解决方案
方案1:返回Promise + 链式调用获取结果
直接把fetch返回的Promise实例从函数里return出去,外部通过.then获取异步返回值:
var express = require('express'); const fetch = require('node-fetch'); const url = 'https://api.github.com/users/github'; function getjsonname(link) { // 这里加return把fetch的Promise返回 return fetch(link) .then(res => res.json()) .then(json => { console.log(json.name + ' log inside function works'); return json.name; }).catch(err => console.error(err)); } // 外部通过.then拿结果 getjsonname(url).then(name => { console.log(name); // 正常打印github })
方案2:用async/await语法简化异步逻辑
这是目前最直观的异步代码写法,语义更清晰:
var express = require('express'); const fetch = require('node-fetch'); const url = 'https://api.github.com/users/github'; // 函数前加async标记 async function getjsonname(link) { try { const res = await fetch(link); const json = await res.json(); console.log(json.name + ' log inside function works'); return json.name; } catch (err) { console.error(err); } } // 调用方式1:在异步函数中用await接收 (async () => { const name = await getjsonname(url); console.log(name); })() // 调用方式2:也可以继续用.then链式调用 // getjsonname(url).then(name => console.log(name))
内容的提问来源于stack exchange,提问作者Matheus Grilo
相关产品推荐
相关产品推荐

