2015-12-15 3 views
0

У меня есть веб-приложение, которое использует JavaScript, jQuery и async.times (среди других компонентов), чтобы получить список исполнителей и песен из Spotify API и вставьте их на страницу по порядку. На моем локальном сервере Node.js эта функциональность работает отлично. Тем не менее, при развертывании в Heroku, кажется, есть ошибка, связанная с асинхронной функцией, потому что она, похоже, дважды запускает цикл и добавляет список два раза.Ошибка Async.times при развертывании приложения Node.js для heroku (повторный цикл)

Это код, который добавляет данные на странице:

var counter = 0; 
     for (var id in relatedArtists) { 
     relatedArtists[counter] = relatedArtists[id]; 
     delete relatedArtists[id]; 
     counter++; 
     } 
async.times(counter, function(n, next) { 
    console.log(n); 
    console.log(relatedArtists[n].id); 
    s.getArtistTopTracks(relatedArtists[n].id, "US", function (err, data2) { 
    relatedArtists[n].song = data2.tracks[0].name; 
    relatedArtists[n].uri = data2.tracks[0].uri; 
    $('#related-artist').append(
     '<p><strong>' + relatedArtists[n].name + '</strong> -- \"' + 
     relatedArtists[n].song + '\"</p>' 
    ); 
    next(null, relatedArtists[n].uri);  
    }); 
}, 

Развернутая версия здесь: http://whatshouldilistentotoday.herokuapp.com/finalproject/

Heroku говорит, что это не должно быть проблемой, с их стороны, потому что они используйте установку void Node.js на ubuntu, но я не могу понять, почему async.times будет запускать определенное количество раз локально, но не на своем сервере.

+0

Возможно, вам понадобится добавить больше источника. Например, как устанавливается счетчик? – Gary

+0

@Gary Я редактировал сообщение, чтобы указать, как устанавливается счетчик. –

+0

Ты делаешь странные вещи. Где инициализируется 'relatedArtists'? Является ли это массивом или объектом? – Bergi

ответ

2

Вы создаете свойства объекта в цикле, который удаляет все свойства этого объекта.

Это попрошайничество для проблемы. Из the spec:

Если новые свойства добавляются к целевому объекту при перечислении, вновь добавленные свойства не гарантируется, подлежащая обработке в активном перечислении.

Так что просто не делайте этого, это полностью зависит от реализации. Я не удивлюсь, если это перейдет в бесконечный цикл и повесит ваш сервер.

Просто используйте два отдельных объекта, для вашего собственного здравомыслия. Кроме того, я не вижу причин использовать эти целые свойства counter, просто перейдите на async.forEachOfSeries вместо этого .times.

+0

Спасибо, я буду работать над этим и подумать об этом дальше. У вас есть идея, почему этот код будет работать на моем локальном сервере, несмотря на его недостатки? Я думаю, что героку просто более строго об этом. –

+0

Для чего нужны два отдельных объекта? СвязанныеИнструкторы и связанные с ними композиции песен? –

+0

@YamiMedina: Возможно, вы используете другую версию узла. Или 'relatedArtits' был инициализирован иначе * как-то * (на самом деле существует множество причин) – Bergi

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