Javascript Node.js回调操作检查

Javascript Node.js回调操作检查,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在编写一个调度程序,返回关于课程的JSON数据。我一周前才开始使用Node.js,所以我不确定我的想法是否正确。 我试图找到一种更好的方法来编写这段代码,避免回调地狱。我已经编写了getJSON方法 /*getJSON(course-name, callback(JSONretrieved)): gets JSON info about name and takes in a callback to manipulate retrieved JSON data*/ 现在我想从课程数组中获取

我正在编写一个调度程序,返回关于课程的JSON数据。我一周前才开始使用Node.js,所以我不确定我的想法是否正确。 我试图找到一种更好的方法来编写这段代码,避免回调地狱。我已经编写了getJSON方法

/*getJSON(course-name, callback(JSONretrieved)): gets JSON info about name and
takes in a callback to manipulate retrieved JSON data*/
现在我想从课程数组中获取多个课程名称,并检查它们之间的时间冲突。然后,我将把所有可行的组合添加到应答数组中。我目前的想法是:

/*courseArray: array of classes to be compared
answers: array of all nonconflicting classes*/
var courseArray = ['MATH-123','CHEM-123']
var answers=[]
getJSON(courseArray[0],function(class1data){
    getJSON(courseArray[1],function(class2data){
         if(noConflict) answers.push( merge(class1data,class2data))
     })
    )
  })
);
最后,为了访问应答数组,我们从上面包装了整个代码:

function getAnswers(cb){
    /*courseArray: array of classes to be compared
answers: array of all nonconflicting classes*/
var courseArray = ['MATH-123','CHEM-123']
var answers=[]
getJSON(courseArray[0],function(class1data){
    getJSON(courseArray[1],function(class2data){
         /check for time conflicts between class1data and class2 data
         if(noConflict(class1data,class2data)) answers.push( merge(class1data,class2data))
     })
    )
  })
);
cb(answers)
}
我们称之为函数

getAnswers(function(ans){
  //do processing of answers
  console.log(ans)
})

我的主要问题是,是否有任何方法可以使这段代码更短、更具可读性或更少回调hecky。

您可以使用promise库来简化自己的工作。如果用户选择了多个课程进行比较,您的做法可能会很快失控


使用类似的方法,您可以调用
getJSON
,一旦所有
getJSON
调用都返回,您的
冲突
代码将在一个回调中运行。对于大量的课程,您的代码将更具可读性和可维护性

在我看来,回调是好的,除非它们不好,否则你将陷入地狱。在这一点上,是时候学习承诺了,或者使用类似的模块,或者等等,我完全同意。仅仅从同步思维(我主要是Java和PHP)过渡到异步是非常不和谐和不自然的,所以我试图通过自己编写回调来强迫自己学习。也许是时候使用承诺了,谢谢。我一定会签出async。我一直在研究Bluebird,但让我远离Bluebird的是,我需要重写我当前的函数,以便它们能够被实现。你认为我应该选择async而不是bluebird是因为这个原因吗?它们都是经过战斗测试且维护良好的库,所以我想说使用最容易集成的库吧!