草庐IT

node.js - 等待函数然后控制台结果

coder 2023-11-04 原文

我想等待我的功能,比如先获取所有结果,然后再安慰我的结果。

exports.listofAllFeaturedProd = (req, res) => {

  Product.find({is_featured:'1'},function(error,fetchallFeatProds)
  {

    var allProducts = new Array();
    var pp = 0;
    var products  = new Array();
    for (var ProductId in fetchallFeatProds)
    {
        var pArr            = [];
        pArr['_id']         = fetchallFeatProds[ProductId]._id;
        pArr['name']        = fetchallFeatProds[ProductId].name;
        pArr['sku']         = fetchallFeatProds[ProductId].sku;
        pArr['description'] = fetchallFeatProds[ProductId].description;
        pArr['price']       = fetchallFeatProds[ProductId].price;
        pArr['large_image'] = fetchingImage(fetchallFeatProds[ProductId]._id);
        pArr['brand']       = fetchingBrand(fetchallFeatProds[ProductId].brand_id);

        console.log('#################### IMAGE ####################');   
        console.log(pArr); 
    pp++;
    }
    console.log(products); 

  });

}; 


function fetchingImage(pid)
{
  ProductImage.findOne({product_id:pid},function(error,fetchallFeatProdsImgs)
  {
    console.log(fetchallFeatProdsImgs.large_image);
     return fetchallFeatProdsImgs.large_image;
  });
}

function fetchingBrand(bid)
{
  Brand.findOne({_id:bid},function(error,fetchAllBrands)
  { 
    console.log(fetchAllBrands);
      return fetchAllBrands;

  });
}

Node 在控制台我的函数结果之后不等待函数和控制台未定义。我如何停止我的代码以获取第一个结果然后控制数组中的所有数据。

console.log(pArr); 的输出

[ _id: 57bd996ebf8c930b2bcc06a1,
  name: 'New Product',
  sku: 'New-Product',
  description: 'New Product',
  price: 'test',
  large_image: undefined,
  brand: undefined ]

之后在函数中添加了控制台,结果如下:

fetchingImage 的输出

images/12.png

fetchingBrand 的输出

{ user_id: '57b42b571fc35e49162de413',
  brand_name: '10 Fork ',
  brand_logo: 'uploads/brands_logo/1472027911329_5.png',
  brand_desc: '10 Fork',
  _id: 57bd5ce6cebed2a3189cedcf,
  __v: 0 }

期望的输出是:

[ _id: 57bd996ebf8c930b2bcc06a1,
  name: 'New Product',
  sku: 'New-Product',
  description: 'New Product',
  price: 'test',
  large_image: images/12.png,
  brand: { user_id: '57b42b571fc35e49162de413',
           brand_name: '10 Fork ',
           brand_logo: 'uploads/brands_logo/1472027911329_5.png',
           brand_desc: '10 Fork',
           _id: 57bd5ce6cebed2a3189cedcf,
           __v: 0 } ]

最佳答案

试试下面的代码:

var temp = [], 
     async = require('async');

async.eachSeries(fetchallFeatProds, function(ProductId, callback)
{
   pArr['_id']         = ProductId._id;
   pArr['name']        = ProductId.name;
   pArr['sku']         = ProductId.sku;
   pArr['description'] = ProductId.description;
   pArr['price']       = ProductId.price;
   pArr['large_image'] = fetchingImage(ProductId._id);
   pArr['brand']       = fetchingBrand(ProductId.brand_id);

   temp.push(pArr);
   callback(null);
}, function(err){
    console.log(temp); //This should give you desired result
});

如果它仍然无法正常工作,请尝试对函数 fetchingImagefetchingBrand 使用 callback。或者您可以尝试在 eachSeries 中使用 async.parallel

编辑:-

async-eachseries

使用回调改变你的功能。

function fetchingImage(pid, callback)
{
    ProductImage.findOne({product_id:pid},function(error,fetchallFeatProdsImgs)
   {
      console.log(fetchallFeatProdsImgs.large_image);
     callback(error,fetchallFeatProdsImgs.large_image);
   });
}

function fetchingBrand(bid, callback)
{
    Brand.findOne({_id:bid},function(error,fetchAllBrands)
    { 
       console.log(fetchAllBrands);
       calback(error,fetchAllBrands);
   });
}

使用 async.parallel 这样它会等到两个函数都完成。然后插入 temp 数组。 Doc to refer

async.eachSeries(fetchallFeatProds, function(ProductId, callback)
{
   var pArr  = {};
   pArr['_id']         = ProductId._id;
   pArr['name']        = ProductId.name;
   pArr['sku']         = ProductId.sku;
   pArr['description'] = ProductId.description;
   pArr['price']       = ProductId.price;
   async.parallel([
     function(callback)
     {
          fetchingImage(ProductId._id, function(err, res){
         pArr['large_image'] = res;
         callback(err); //Forgot to add
      });
   },
    function(callback)
   {
      fetchingBrand(ProductId.brand_id,function(err, res){
         pArr['brand'] = res;
         callback(err); //Forgot to add
      });
   },
], function(err){

   console.log(pArr); //Edit
   temp.push(pArr);
   callback(err); 
})
  }, function(err){
    console.log(temp); //This should give you desired result
    callback(err);
});

关于node.js - 等待函数然后控制台结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39138537/

有关node.js - 等待函数然后控制台结果的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  6. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  9. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  10. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

随机推荐