如果我在 my app 中输入股票“goog”日志是:
responseStock =
stockPrice = 1193.9900
updateStockPrice was a success
[ { stock: 'GOOG', price: '1193.9900', likes: 0 } ]
我已经阅读了很多很多关于 async/await(和 Promises)的文章,包括在 stackoverflow.com 上,并在 freeCodeCamp 论坛上提出了这个问题,但没有得到回应或已经能够弄清楚。我已经尝试了很多代码变体,但未能解决异步问题。我现在的位置是在所有函数上放置 await/async,但它不起作用。
app.route('/api/stock-prices')
.get(function (req, res){
var stock1 = req.query.stock1.toUpperCase();
var stock2; //if stock2 compare stock prices
if (req.query.stock2) { stock2 = req.query.stock2.toUpperCase();}
var like = req.query.like ? 1 : 0;
//console.log("like " + like)
var ip = like ? req.ip : null;
//console.log("ip is " + ip);
var stockPrice;
var responseStock = [];
var sendResponse = async (response) => {
if (response.lenght > 1) { //user entered 2 stocks to compare
var likes0 = response[0].likes - response[1].likes; //compare relative likes
var likes1 = response[1].likes - response[0].likes;
await res.json({"stockData": [{"stock": response[0].stock, "price": response[0].price, "rel_likes": likes0},
{"stock": response[1].stock, "price": response[1].price, "rel_likes": likes1}]});
} else {
console.log("responseStock = " + response);
await res.json({"stockData": response});
};
};
var addNewStock = async (stock) => {
var newStock = await new Stock({stock: stock, price: stockPrice, likes: like});
console.log(newStock);
newStock.save( (err, doc) => {
if (err) { console.log(err); }
else if (!doc) { console.log("addNewStock failed")}
else {
console.log("addNewStock was a success");
responseStock.push({"stock": doc.stock, "price": doc.price, "likes": doc.likes});
console.log(responseStock);
}
});
};
var updateStockPriceAndLikes = async (stock) => {
await Stock.findOneAndUpdate({stock: stock}, {price: stockPrice, $inc: {likes: like}, $push: {ip: ip}},
{new: true}, function(err, doc) {
if (err) { console.log(err); }
else if (!doc) { console.log("updateStockPriceAndLikes failed"); }
else {
console.log("updateStockPriceAndLikes was a success");
responseStock.push({"stock": doc.stock, "price": doc.price, "likes": doc.likes});
console.log(responseStock);
}
})
};
var updateStockPrice = async (stock) => {
console.log("stockPrice = " + stockPrice)
await Stock.findOneAndUpdate({stock: stock}, {price: stockPrice},
{new: true}, async function(err, doc) {
if (err) { console.log(err); }
else if (!doc) { console.log("updateStockPrice failed"); }
else {
console.log("updateStockPrice was a success");
responseStock.push({"stock": doc.stock, "price": doc.price, "likes": doc.likes});
console.log(responseStock);
}
})
};
var handleStock = async (stock) => {
if (stock) {
if (ip) { // like is checked
await Stock.findOne({stock: stock}, async function(err, doc) {
if (err) { console.log(err); }
else if (!doc) {
await addNewStock(stock); //not in db, add new
} else if (doc.ip.indexOf(ip) < 0) { //ip not found
await updateStockPriceAndLikes(stock); //and push ip to db
} else {
await updateStockPrice(stock);
}
})
} else if (!ip) { //like is not checked
await Stock.findOne({stock: stock}, async function(err, doc) {
if (err) { console.log(err); }
else if (!doc) {
await addNewStock(stock);
} else {
await updateStockPrice(stock);
}
});
}
};
};
var getStockPrice = async (stock) => {
var url = "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol="
+ stock + "&apikey=" + process.env.ALPHA_API_KEY;
await request(url, {json: true}, async function(err, resp, body) {
if (err) { console.log(err); }
else if (!body["Global Quote"]["05. price"]) {
await res.send("please enter a valid stock");
}
else {
//console.log("stockPrice = " + body["Global Quote"]["05. price"]); //correctly logs stock price
stockPrice = body["Global Quote"]["05. price"];
await handleStock(stock);
}
})
};
var begin = async () => {
await getStockPrice(stock1);
if (stock2) {
await getStockPrice(stock2);
}
await sendResponse(responseStock);
};
begin();
/*responseStock = [ { stock: 'GOOG', price: '1250.4100', likes: 0 },
{ stock: 'MSFT', price: '141.3400', likes: 0 } ]*/
});
我希望日志是
stockPrice = 1193.9900
updateStockPrice was a success
[ { stock: 'GOOG', price: '1193.9900', likes: 0 } ]
responseStock = [{ stock: 'GOOG', price: '1193.9900', likes: 0 }]
看来,我有一个我无法弄清楚的异步问题。
最佳答案
正如@jfriend00 在评论中提到的,await 不会在不返回 promise 的函数上工作。因此,我需要使用 await 的函数必须更改为返回一个 promise。
因此,例如,这不起作用:
var getStockPrice = (stock) => {
//request data from API
};
var begin = async () => {
await getStockPrice(stock1);
if (stock2) { await getStockPrice(stock2); }
sendResponse(responseStock);
};
begin();
但这确实有效:
var getStockPrice = (stock) => {
return new Promise( (resolve, reject) => {
//Request data from API
resolve();
})
};
var begin = async () => {
await getStockPrice(stock1);
if (stock2) { await getStockPrice(stock2); }
sendResponse(responseStock);
};
begin();
关于javascript - 我的作业项目 : Stock Price Checker 的异步/等待问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343398/
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub