2014-11-10 1 views
0

Я хочу использовать чертеж API и автоматически выполнять его с помощью grunt. Я хочу прочитать файл пасеки (инструмент для API), разбор его (с помощью Protagonist, который представляет собой API Blueprint Parser для Node.js), строит его в формате JSON и записывает в другой файл. Это простая задача, но я не знаю, как это сделать, я всегда получаю неопределенный результат. Вот то, что я до сих пор:node.js - grunt - возвращает обработанные данные из обратного вызова

grunt.registerTask('apiary2js', 'Generate js version of apiary file.', function() { 
    var parser = require('protagonist'); 
    var content = grunt.file.read('apiary.apib'); 
    var blueprint = parser.parse(content, function (error, result) { 
     if (error) { 
      console.log(error); 
      return; 
     } 

     return result.ast; <-- (how to return this value?) 
    }); 
    var json = JSON.stringify(blueprint); 
    grunt.file.write('test/frontend/apiary.js', "var apiary = " + json); 
}); 

И в результате apiary.js это:

var apiary = undefined 

ответ

2

Проблема вы бежите в том, что метод parser.parse() принимает функцию обратного вызова, который выполняется асинхронно. Вы не можете вернуть значение из обратного вызова, как в синхронном методе, потому что вы не знаете, когда он будет выполнен. Решение состоит в том, чтобы поместить логику возврата в обратный вызов.

grunt.registerTask('apiary2js', 'Generate js version of apiary file.', function() { 
    var parser = require('protagonist'); 
    var content = grunt.file.read('apiary.apib'); 

    // Parse the contents of the file & execute the callback when done parsing. 
    parser.parse(content, function (error, result) { 

     if (error) { 
      console.log(error); 
      return; 
     } 

     // Now we can use the result as desired. 
     var json = JSON.stringify(result.ast); 
     grunt.file.write('test/frontend/apiary.js', "var apiary = " + json); 
    }); 

});