jjzjj

javascript - 我的作业项目 : Stock Price Checker 的异步/等待问题

coder 2023-11-07 原文

如果我在 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/

有关javascript - 我的作业项目 : Stock Price Checker 的异步/等待问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为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

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过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

  4. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的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

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的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服务器更新战俘

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的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="

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐