Передаю в функцию данные на обработку, что бы в последствии записать результат обработки в текстовый файл. Судя по очередности срабатывания логов, понимаю что проблема в том, что значение не успевает вернуться, но не приложу ума как с этим быть. Очень нуждаюсь в совете. Собственно сама функция:
function convertMe(polygonArray){
var toWrite = '';
var dataToReturn = '';
var polygon = JSON.parse(polygonArray);
var isFirst = true;
var printFeature = function (name, poly) {
var out = {
"type": "Feature",
"properties": {
'name': name,
},
"geometry": {
"type": "Polygon",
"coordinates": poly
}
};
out = JSON.stringify(out);
if(!isFirst) {
out = ',' + out
}
isFirst = false;
toWrite = toWrite + out;
}
toWrite = toWrite + '{"type": "FeatureCollection","features": [';
async.mapSeries([polygon], function (poly, cb) {
var options = {
coords: poly,
precision: 6,
rowMode: true,
hashMode: 'extent',
threshold: 0.2
};
printFeature('shape', poly);
var rowStream = hasher.stream(options),
a = 0;
rowStream
.on('end', cb)
.pipe(through2.obj(function (arr, enc, callback) {
for(var i = 0; i < arr.length; i++) {
var bb = ngeohash.decode_bbox(arr[i]);
printFeature(arr[i], [
[
[bb[1], bb[2]],
[bb[3], bb[2]],
[bb[3], bb[0]],
[bb[1], bb[0]],
[bb[1], bb[2]]
]]);
}
callback();
}));
}, function () {
toWrite = toWrite + ']}';
console.log('Внутри вызова '+toWrite);
return toWrite;
});
};
Место ее вызова:
worldData.features.forEach(function(feature){
q.defer(function(done){
var dataToConvert = JSON.stringify(feature.geometry.coordinates);
console.log('Место вызова '+convertMe(dataToConvert));
//fs.writeFileSync(currDir+'/'+outputDir+'/'+'cell_'+i+'.s2', convertMe(dataToConvert));
i++;
done()
});
});
Вывод в консоль:
Место вызова undefined
Внутри вызова {"type": "FeatureCollection","features": [{"type":"Feature","properties":{"name":"shape"},"geometry":{"type":"Polygon","coordinates":[[[[-56.0828202,46.8785071],[-56.0832065,46.8780553],[-56.0840219,46.877938],[-56.0843308,46.8776271],[-56.0848973,46.8777385],[-56.0852407,46.8776564],[-56.0858329,46.8777385],[-56.0865109,46.8773278],[-56.0874293,46.8769875],[-56.0878327,46.877146],[-56.0880559,46.8770697],[-56.0886396,46.8767118],[-56.0895236,46.8764771],[-56.0898154,46.8763011],[-56.0900643,46.8759197],[-56.0904506,46.8756733],[-56.0915664,46.8757554],[-56.0923045,46.8757437],[-56.0929568,46.8755618],[-56.0933002,46.8758024],[-56.0939696,46.8763656],[-56.0944245,46.8769054],[-56.0951026,46.8773689],[-56.0945619,46.8778089],[-56.0939868,46.8784015],[-56.0929483,46.8789295],[-56.0917295,46.8794399],[-56.0907767,46.8796981],[-56.0896781,46.8799797],[-56.0895408,46.8801029],[-56.0891803,46.8802613],[-56.0892404,46.8804549],[-56.0888112,46.88076],[-56.0883048,46.880801],[-56.0880044,46.8810533],[-56.0866397,46.8813232],[-56.0853265,46.8811354],[-56.0846227,46.8810357],[-56.0850347,46.8808069],[-56.084163,46.8808322],[-56.083258,46.8804314],[-56.0830348,46.8801791],[-56.0830434,46.8797333],[-56.0830863,46.8794399],[-56.0837043,46.8792757],[-56.0834468,46.8791994],[-56.0835841,46.8790586],[-56.0833266,46.8789706],[-56.0832665,46.8788239],[-56.0835498,46.8784308],[-56.0830348,46.8786948],[-56.0828202,46.8785071]]]]}},{"type":"Feature","properties":{"name":"fb24ew"},"geometry":{"type":"Polygon","coordinates":[[[-56.09619140625,46.8841552734375],[-56.085205078125,46.8841552734375],[-56.085205078125,46.878662109375],[-56.09619140625,46.878662109375],[-56.09619140625,46.8841552734375]]]}},{"type":"Feature","properties":{"name":"fb24ey"},"geometry":{"type":"Polygon","coordinates":[[[-56.085205078125,46.8841552734375],[-56.07421875,46.8841552734375],[-56.07421875,46.878662109375],[-56.085205078125,46.878662109375],[-56.085205078125,46.8841552734375]]]}},{"type":"Feature","properties":{"name":"fb24et"},"geometry":{"type":"Polygon","coordinates":[[[-56.09619140625,46.878662109375],[-56.085205078125,46.878662109375],[-56.085205078125,46.8731689453125],[-56.09619140625,46.8731689453125],[-56.09619140625,46.878662109375]]]}},{"type":"Feature","properties":{"name":"fb24ev"},"geometry":{"type":"Polygon","coordinates":[[[-56.085205078125,46.878662109375],[-56.07421875,46.878662109375],[-56.07421875,46.8731689453125],[-56.085205078125,46.8731689453125],[-56.085205078125,46.878662109375]]]}}]}
То есть сначала мне выводится Undefined из места вызова, а лишь затем уже результат работы (к слову верный и тот который мне нужен) в месте
async? Так и должно быть. Не используйте асинхронных операций и не будет таких проблем – ArchDemon Aug 28 '16 at 19:56convertMeне возращает значение вообще. Единственныйreturnстоит вcallbackфункцииasync.mapSeries, а именноreturn toWrite;. Во вторых, даже если вы напишитеreturnдля функцииconvertMe, у вас все равно не будет работать. – Stepan Kasyanenko Aug 29 '16 at 05:55