我有以下代码在server / statusboard.js; var require = __meteor_bootstrap__.require, request = require("request") function getServices(services) { services = []; request('http://some-server/vshell/index.php?type=services&mode=json', function (error, response, body) { var resJSON = JSON.parse(body); _.each(resJSON, function(data) { var host = data["host_name"]; var service = data["service_description"]; var hardState = data["last_hard_state"]; var currState = data["current_state"]; services+={host: host, service: service, hardState: hardState, currState: currState}; Services.insert({host: host, […]
假设你维护一个公开函数getData的库。 您的用户称之为获取实际数据: var output = getData(); 数据保存在文件中,所以你使用Node.js内置的fs.readFileSync来实现getData 。 很显然, getData和fs.readFileSync都是同步函数。 有一天,您被告知将底层数据源切换到一个只能asynchronous访问的回购库(如MongoDB)。 你也被告知要避免让用户streamgetData , getData API不能改变只返回一个promise或者需要一个callback参数。 你如何满足这两个要求? 使用callback / promise的asynchronous函数是JavasSript和Node.js的DNA。 任何不平凡的JS应用程序可能渗透了这种编码风格。 但这种做法很容易导致所谓的厄运callback金字塔。 更糟糕的是,如果调用链中的任何调用者的代码都依赖于asynchronous函数的结果,那么这些代码也必须被包装在callback函数中,并且对调用者施加编码风格约束。 有时我会发现需要将asynchronous函数(通常在第三方库中提供)封装到同步函数中,以避免大规模的全局重构。 在这个主题上寻找解决scheme通常最终会得到Node Fibers或npm包。 但纤维丝毫无法解决我所面临的问题。 即使Fibers的作者提供的例子也说明了这一缺陷: … Fiber(function() { console.log('wait… ' + new Date); sleep(1000); console.log('ok… ' + new Date); }).run(); console.log('back in main'); 实际产出: wait… Fri Jan 21 2011 22:42:04 GMT+0900 (JST) back […]