2016-10-06 3 views
3

У меня проблема, которую я просто не могу понять. Если бы кто-нибудь мог предложить некоторые советы, я был бы признателен.Unhandled Promise rejection: Не удается вызвать метод 'push' от нуля

Я использую Ionic2 с Meteor/Mongo для создания чат-приложения.

У меня есть следующий код:

private findChats(): Promise<Mongo.Collection<Chat>> { 
    let promise: Promise<Mongo.Collection<Chat>> = new Promise<Mongo.Collection<Chat>>(resolve => { 
     let registeredIds: String[] = [this.senderId]; 
     for (let i = 0; i < this.jobModelsForSender.length; i++) { 
     console.log('findChats: registeredIds.push this.jobModelsForSender[i].id: ' + registeredIds + ' - ' + this.jobModelsForSender[i].id); 
     registeredIds.push('J' + this.jobModelsForSender[i].id); 
     console.log('findChats: pushed: ' + registeredIds); 
     } 
     this.subscribe('chats', this.senderId, registeredIds,() => { 
     console.log('findChats: in subscribe: ' + this.senderId+' '+registeredIds); 

     let chats: Mongo.Cursor<Chat> = Chats.find(
      { memberIds: { $in: registeredIds } }, 
      { 
      sort: { lastMessageCreatedAt: -1 }, 
      transform: this.transformChat.bind(this), 
      fields: { memberIds: 1, lastMessageCreatedAt: 1 } 
      } 
     ); 
     console.log('findChats: chats: ' + chats); 
     this.chats = chats; 
     let localChatCollection: Mongo.Collection<Chat> = new Mongo.Collection<Chat>(null); 
     chats.forEach((chat: Chat) => { 
      localChatCollection.insert(chat); 
     }); 
     console.log('findChats: resolve(localChatCollection): ' + localChatCollection); 
     resolve(localChatCollection); 
     }); 
    }); 
    return promise; 
    } 

Но я получаю следующий результат:

findChats: registeredIds.push this.jobModelsForSender[i].id: P8 - 72 app.bundle.js:118232 
findChats: pushed: P8,J72 app.bundle.js:118234 
findChats: registeredIds.push this.jobModelsForSender[i].id: P8 - 72 app.bundle.js:118232 
findChats: pushed: P8,J72 app.bundle.js:118234 
findChats: registeredIds.push this.jobModelsForSender[i].id: P8 - 72 app.bundle.js:118232 
findChats: pushed: P8,J72 app.bundle.js:118234 
Unhandled Promise rejection: Cannot call method 'push' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError {stack: (...), message: "Cannot call method 'push' of null"} zone.js:461 
Error {rejection: TypeError, promise: ZoneAwarePromise, zone: Zone, task: ZoneTask, stack: (...)…} 
zone.js:463 
Unhandled Promise rejection: Cannot call method 'push' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError {stack: (...), message: "Cannot call method 'push' of null"} zone.js:461 
Error {rejection: TypeError, promise: ZoneAwarePromise, zone: Zone, task: ZoneTask, stack: (...)…} 
zone.js:463 
Unhandled Promise rejection: Cannot call method 'push' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError {stack: (...), message: "Cannot call method 'push' of null"} zone.js:461 
Error {rejection: TypeError, promise: ZoneAwarePromise, zone: Zone, task: ZoneTask, stack: (...)…} 
zone.js:463 
findChats: in subscribe: P8 P8,J72 app.bundle.js:118243 
findChats: chats: [object Object] app.bundle.js:118249 
findChats: resolve(localChatCollection): [object Object] 

Как вы можете видеть, я получаю сообщение об ошибке в zone.js. Насколько я могу судить, когда я отлаживаю это, и, как показывают журналы, он успешно выполняет push до registeredIds. Затем он выходит из функции, возвращая promise. После этого он переходит в zone.js, где ошибка регистрируется.

+0

Проблема здесь в том, что обещание не разрешено синхронно, а скорее асинхронно. Смысл, что во время выполнения в коде registerIds еще не существует. Вам нужно будет подождать, пока обещание будет разрешено, и продолжите выполнение кода после этого. Попробуйте не только выводить на консоль, но и фактически отлаживать ее с помощью отладчика внутреннего браузера, чтобы увидеть, когда он не определен. – Anton

+0

Спасибо, что посмотрели в Антоне, я проверю его. – Richard

+1

Спасибо, это было, у меня было событие, которое одновременно вызывало одно и то же обещание. Как только я удаляю триггер на это событие, я не получаю никаких ошибок. Цените помощь. – Richard

ответ

1

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

У меня было событие, которое одновременно вызывало одно и то же обещание. Как только я удаляю триггер на это событие, я не получаю никаких ошибок.

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