Javascript 带有回调函数的Nodejs循环

Javascript 带有回调函数的Nodejs循环,javascript,node.js,callback,Javascript,Node.js,Callback,我不熟悉nodejs回调函数。我必须找到给定的两个价格范围之间的电话列表,如果获得的列表中没有15部电话,我必须更改价格范围,直到我得到15部电话。实际上,我在另一个文件中编写了从数据库中搜索电话的函数,从该文件我向调用函数发送回调。在得到回调后,如果数组大小小于15,我必须检查数组大小,然后更改价格范围,并且必须调用相同的函数,如递归或循环。我无法处理回调函数。请帮我写正确的代码 while(true ){ console.log("around came")

我不熟悉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是不可到达的语句。我受不了。请帮帮我。

问题是您试图以同步方式使用异步代码。这根本不行,因为回调可以在几秒钟后调用。除此之外,如果在函数内部调用,则中断将不起作用。 你真正要做的是无限次地调用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);
                 }
             });
}

while(true)
-这不是一个好主意。是的,我知道如何修改您已经在使用回调(只需在else分支中添加一个),因此不确定问题出在哪里。好的,我正在尝试先删除无限循环:递归DB调用很少是一个好的解决方案,建议采用两步解决方案,首先“分区”DB是按价格范围划分的,因此知道您必须选择哪个范围才能获得足够的结果。第二:我们谈论的是什么货币?1000美元对我来说是一个步骤,可以容纳(几乎)所有可用的电话。在1000美元的价格范围内,您有多少个结果/电话?只是想了解一下我们讨论的递归调用的数量。记住node.js不是单线程的,实际上是单线程运行您的代码并将I/O绑定的工作委托给线程池,如下所述:是的,但您的代码只在单线程中运行。至少据我所知。是的,我犯了一个错误,写node.js是单线程的。但阻止问题while(true)仍然成立。是的,你的答案完全正确,我相信你能够找出错误,我只是试图纠正一个错误的概念,即一些node.js开发人员认为node.js是单线程的(完全),好吧,我明白了。你这么做是对的。我知道node.js(和浏览器)不是单线程的,但它们只使用单线程来运行js。好。。。不包括网络工作者和其他类似的解决方案。