【问题标题】:Nodejs looping with callback functionNodejs循环使用回调函数
【发布时间】:2016-05-21 08:26:22
【问题描述】:

我是 nodejs 回调函数的新手。我必须在给定的两个价格范围之间找到手机列表,如果获得的列表中没有 15 部手机,我必须更改价格范围,直到获得 15 部手机。实际上,我在另一个文件中编写了用于从数据库中搜索电话的函数,从该文件中我将回调发送到调用函数。收到回调后,如果数组大小小于 15,我必须检查数组大小,然后更改价格范围,并且必须调用相同的函数,如递归或循环。我无法处理回调函数。请帮助我编写正确的代码。

 while(true ){
            console.log("around came")
             Search.findBestMobile(context.end_price , context.start_price , function(data){
                 console.log("Best Mobile");
                 size = data.hits.hits.length;
                 if(size >= 15){
                     context.phone_list = makeStringFromArray(data.hits.hits);
                     cb(context);
                     break;
                 }else{
                     context.start_price += 1000;
                     context.end_price   += 1000;
                 }
             });
         }

但是在上面的代码中,break 是无法访问的语句。我应付不来。请帮帮我。

【问题讨论】:

  • while(true) - 这不是一个好主意。
  • 是的,我知道,如何修改
  • 你已经在使用回调了(在 else 分支中再添加一个),所以不确定是什么问题。
  • 好的,我正在尝试删除无限循环
  • 首先:递归数据库调用很少是一个好的解决方案,建议采用两步解决方案,您首先按价格范围“分区”数据库,因此知道必须选择哪个范围才能获得足够的结果。 第二:我们在谈论什么货币? 1000 美元对我来说是包含(几乎)所有可用手机的一步。在这 1000 美元的价格范围内,您大约有多少结果/电话?只是想知道我们正在谈论多少递归调用。

标签: javascript node.js callback


【解决方案1】:

问题是您试图以同步方式使用异步代码。那根本行不通,因为可以在几秒钟后调用回调。除此之外,如果在函数内部调用 break 将不起作用。 你真正在做什么是无限次调用 Search.findBestMobile。 Node.js 只有一个线程用于运行您的代码并且您正在阻止它。所以不会调用回调。

您需要做的是对循环使用递归或其他异步方法。 一种简单的方法是使用新的上下文再次调用您的外部函数。

function searchRange(context, cb) {
    Search.findBestMobile(context.end_price , context.start_price , function(data){
                 console.log("Best Mobile");
                 size = data.hits.hits.length;
                 if(size >= 15){
                     context.phone_list = makeStringFromArray(data.hits.hits);
                     cb(context);
                 }else{
                     context.start_price += 1000;
                     context.end_price   += 1000;
                     searchRange(context, cb);
                 }
             });
}

【讨论】:

  • 请记住,node.js 不是单线程的,实际发生的是单线程运行您的代码并将 I/O 绑定的工作委托给线程池如此处所述:haneycodes.net/to-node-js-or-not-to-node-js
  • 是的,但是您的代码仅在单线程中运行。至少据我所知。所以是的,我写错了 node.js 是单线程的。但是 while(true) 的阻塞问题仍然成立。
  • 是的,您的回答是完全正确的,我相信您能够查明错误,我只是想纠正一些 node.js 开发人员认为 node.js 是单线程的错误概念(完全)
  • 好的,我明白了。你这样做是对的。我知道 node.js(和浏览器)不是单线程的,但它们只使用单线程来运行 js。嗯...不包括网络工作者和其他类似的解决方案。
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多