我之前问过这个问题,并且它与这个问题(How do I return the response from an asynchronous call?)相关联,但不能解决我的问题
我是node.js的新手,并且遇到一些我无法处理的错误或无法理解的任何帮助。我使用express-generator初始化应用程序。我正在尝试通过api调用向前端发送对象。我写了一个带有函数makeApiCall()的类“ StockClass.js”,该函数进行调用并返回对象。但是,当我在路由器中调用该功能时,我会得到“未定义”。继承人代码
//==== StockClass.js ===
const yahooFinance = require("yahoo-finance");
class stockClass {
static makeApiCall(symbol) {
yahooFinance.quote(
{
symbols: [symbol],
modules: ["price", "summaryDetail"],
},
function (err, quotes) {
if (err) { console.log(err) }
console.log(quotes)
return quotes;
}
);
}
}
module.exports = stockClass;
//=====index.js======
const StockClass = require("../handlers/StockClass");
router.get("/new", function (req, res) {
let quotes = StockClass.makeApiCall("AAPL");
console.log(quotes);
res.render('path', { quotes });
});
StockClass.js中的console.log正确记录了对象(引用),而index.js中的console.log记录了“未定义”。
下面的链接介绍了yahoo-finance api调用。 https://www.npmjs.com/package/yahoo-finance
================================================ =========================
我也尝试使用中间件并将数据附加到响应对象上,如下所示:>
//==========middleware========= const yahooFinance = require("yahoo-finance"); module.exports = { makeApiCall: (symbol) => { return function (req, res, next) { yahooFinance.quote( { symbols: [symbol], modules: ["price", "summaryDetail"], }, function (err, quotes) { if (err) { console.log(err) } res.stockObj = quotes; console.log(res.stockObj); } ); next(); } } } //======= index.js ========= const handler = require("./handlers/stockUtils"); router.get("/new", handler.makeApiCall("AAPL"), function (req, res) { let quotes = res.stockObj; console.log(quotes); res.render('path', { quotes }); });
结果是一样的。中间件函数中的console.log记录正确的对象,但index.js中的console.log记录未定义
我早先问过这个问题,它与此问题相关联(我如何从异步调用中返回响应?)但是它不能解决我的问题,我对node.js还是很陌生,我...
[这是异步编程(非阻塞)的经典案例,来自同步编程背景(例如python
,java
,c
等),我也面临着理解javascript
中代码流的问题]。我花了一段时间,但是一旦掌握了javascript语言的行为方式,您将能够看到JS引擎如何解释代码以及如何执行代码。以下是一些可能会有用的链接: