2015-07-22 3 views
0

Попытка получить данные API. У меня проблема с созданием действующего JSON после модификации.Node.js + bluebird + JSON. JSON недействителен после модификации

Данные должны выглядеть следующим образом: [{"1"}, {"2"}, {"3"}, ..., {201}, {202}, {203}, ...]

но теперь: [{"1"}, {"2"}, {"3"}, ...], [{"201"}, {"202"}, {"203"}. ..]

Где моя ошибка?

var Promise = require("bluebird"); 
var request = require('bluebird').promisifyAll(require('request')); 
var fs = Promise.promisifyAll(require('fs')); 
var ladders = {"hardcore":"hardcore", "standard":"standard"}; 

function getJSONsync(urls) { 
    var ladder = []; 
    Promise.map(urls, function(url) { 
     return request 
      .getAsync(url) 
      .spread(function (res, body) { 
       if (res.statusCode != 200) { 
        throw new Error('Unsuccessful attempt. Code: '+ res.statusCode); 
       } 
       return JSON.stringify(ladder.concat(JSON.parse(body).entries), "", 4); 
      }) 
      .catch(console.error); 
    },{ concurrency: 10 }) 
    .then(function(arr) { 
     fs.writeFileAsync('file.json', arr); 
    }) 
} 

function setUrls(ladderName, offset, limit) { 
    var arr = []; 

    while(offset < 15000) { 
     arr.push('http://api.pathofexile.com/ladders/'+ladderName+'?offset='+offset+'&limit='+limit); 
     offset = offset + 200; 
    } 

    return arr; 
} 

getJSONsync(setUrls(ladders.hardcore, 0, 200)); 

Thx для справки. Извините за мой английский.

Наконец:

var Promise = require("bluebird"); 
var request = require('bluebird').promisifyAll(require('request')); 
var fs = Promise.promisifyAll(require('fs')); 

var ladders = {"hardcore":"hardcore","standard":"standard"}; 

function getJSONsync(urls) { 
    Promise.map(urls, function(url) { 
    return request 
     .getAsync(url) 
     .spread(function (res, body) { 
     if (res.statusCode != 200) { 
      throw new Error('Unsuccessful attempt. Code: '+ res.statusCode); 
     } 
     return JSON.parse(body).entries; 
     }) 
     .catch(console.error); 
    },{ concurrency: 10 }) 
    .reduce(function(a, b) { return a.concat(b) }) 
    .then(function(arr) { 
    fs.writeFileAsync('file.json', JSON.stringify(arr, "", 4)); 
    console.log(arr.length); 
    }) 
} 

function setUrls(ladder, offset, limit) { 
    var arr = []; 

    while(offset < 15000) { 
     arr.push('http://api.pathofexile.com/ladders/'+ladder+'?offset='+offset+'&limit='+limit); 
     offset = offset + 200; 
    } 

    return arr; 
} 

getJSONsync(setUrls(ladders.hardcore, 0, 200)); 

ответ

1

Promise.map возвращает массив, поэтому, когда вы делаете ladder.concat вы возвращаетесь другой массив, поэтому он становится [[{"1"}], [{"1", "2"}]

Вы должны просто удалить CONCAT:

return JSON.stringify(JSON.parse(body).entries, "", 4);

Но если вы хотите использовать перегородку вы можете ladder.push(JSON.stringify(JSON.parse(body).entries, "", 4)) и использовать его вместо обр возвращаемой переменной

+0

ТНХ для ответа, теперь я знаю, как использовать .map :) Я просто добавить .reduce (функция (а, б) {возвращение a.concat (b)}) после .map, и теперь у меня есть действительный json –

Смежные вопросы