2015-12-22 98 views
0

我正在编写一个调度程序,该程序返回有关课程的JSON数据。一个星期前我刚刚开始Node.js,所以我不确定我是否正确。 我正试图找到更好的方式来编写此代码并避免回调地狱。我已经写了getJSON方法。Node.js回调操作检查

/*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。

+2

在我看来,回调是好的,直到他们不是,你在地狱。那时候是学习承诺的时候了,或者使用[bluebird](https://github.com/petkaantonov/bluebird),[async](https://github.com/caolan/async)或[Q ](https://github.com/kriskowal/q)等 – adeneo

+0

是的,我完全同意。从同步思维模式(我主要是Java和PHP)转换到异步模式非常刺激和不自然,所以我试图通过自己编写回调来强制自己学习。虽然 –

回答

0

您可以使用承诺库让自己更容易。如果用户选择一些以上的课程进行比较,那么你的做法可能会很快失去控制。

的东西,如async,可以使parallel调用getJSON和你代码将一个回调,一旦所有的getJSON调用已经返回内运行。您的代码对于大型课程阵列将更具可读性和可维护性。

+0

可能是使用承诺的时间谢谢。我一定会检查异步。我一直在寻找蓝鸟,但是让我从蓝鸟中离开的原因是我需要重写当前的功能,以便它们能够被普遍化。你认为我应该为蓝鸟选择异步吗? –

+0

他们都是经过战斗考验和维护良好的图书馆,所以我会说,去任何最容易融合! – Anchor