2016-06-02 5 views
1

Я работал над интеграцией облачных вычислений на основе единой интеграции для слабого канала нашей команды. И застрял с надлежащим обратным вызовом. Похоже, вернуть значение null до завершения задачи asyc, поэтому нужна некоторая помощь в создании надлежащего асинхронного обратного вызова. Я включил скрипт и результат console.log.nodejs generator async callback - slack unity cloud build

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"}

+1

Генераторы не делают асинхронный код волшебно синхронными. Лучше забудьте о них здесь. – Bergi

+0

Я не парень из джава, я больше склонен к C#. Я хотел бы реализовать это для игрового проекта нашей команды. Поэтому любой помощник или альтернативный метод был бы полезен. – Appslabs

+0

Сделайте это с помощью обратных вызовов, когда вы все еще узнаете о JavaScript. – Bergi

ответ

1

я, наконец, нашел решение, я пересмотрел логику и разработал простые обработчики событий.

Поскольку я уже использовал асинхронный обратный вызов успешно, это было бессмысленно делать нежелательные генераторы на вершине.

Вот решение, с которым я столкнулся. Гораздо проще и чище, чем в старой версии.

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); 
 
}