nodejs生成器asynchronouscallback – 松散统一云构build

我正在为我们团队的闲暇频道开展定制统一云构build整合工作。 并陷入适当的callback。 它看起来像在asyc任务完成之前返回null,所以需要一些帮助做出适当的asynchronouscallback。 我已经包含脚本和console.log结果。

var request = require('request'); var config = require('../../config.js'); var slackManager = require('../slack/slackmanager.js'); module.exports = { AlertSlack: function (payload) { var getLink = GetLink(payload); console.log(getLink.next()); slackManager.alertSlack(getLink.next().value); } } function* GetLink(payload) { try { var shareEndPointURL = config.unity.apibaseurl + payload.links.api_self.href + "/share"; var shareID = yield HttpRequestHandler(shareEndPointURL, 'GET'); //space to yield more httpRequest //space to yield more httpRequest //space to yield more httpRequest return " some final data "; } catch (e) { console.log("Exception : " + e); return e; } } function HttpRequestHandler(endpointURL, httpMethod) { var options = { url: endpointURL, method: httpMethod, headers: config.unity.unityAuthHeaders } request(options, function (err, resp, body) { console.log(body); return body; }); } 

这里是控制台日志

 { value: undefined, done: false } <-----recived call in slackmanager.js with ### some final data ###-----> {"shareid":"dfgdfgszdffzc"} 

我终于find了解决scheme,我重新考虑了逻辑并制定了简单的事件处理程序。

由于我已经成功地使用了一个asynchronouscallback,所以在它上面创build不需要的生成器是没有意义的。

这是我提出的解决scheme。 比旧版本更简单和干净。

 var request = require('request'); var config = require('../../config.js'); var slackManager = require('../slack/slackmanager.js'); module.exports = { AlertSlack: function (payload) { var shareEndPointURL = config.unity.apibaseurl + payload.links.api_self.href + "/share"; HttpRequestHandler(shareEndPointURL, "GET", HandleShareID); } } function HttpRequestHandler(endpointURL, httpMethod, handler) { var options = { url: endpointURL, method: httpMethod, headers: config.unity.unityAuthHeaders } request(options, function(error, response, body) { handler(JSON.parse(body)); }); } function HandleShareID(result){ var downloadURL = config.unity.downloadEndPointBase + result.shareid; HttpRequestHandler(downloadURL, 'GET', HandleDownLoadedData); } function HandleDownLoadedData(result) { slackManager.alertSlack(result); }