2016-10-12 20 views
-1

私はPromiseを持っていますが、データを使用しようとすると非同期呼び出しが完了していないため、機能しません。Javascript Promise Anti-pattern

私はPromise ant-patternsでhereを探しています。これは私の修正です。しかし、私はJavascriptで弱いので、私は彼らの提案を実装するのに苦労しています。誰かが助けることができれば、私はそれを感謝します。

マイコード:

private findLocalChatsWithLastMessageForChat(): Promise<Mongo.Collection<Chat>> { 
    let promise: Promise<Mongo.Collection<Chat>> = new Promise<Mongo.Collection<Chat>>(resolve => { 
     let localChatCollection: Mongo.Collection<Chat> = new Mongo.Collection<Chat>(null); 
     for (let i: number = 0; i < this.chatsStorageService.chats.length; i++) { 
     let chat: Chat = this.chatsStorageService.chats[i]; 
     let findLastMessageForChatPromise: Promise<Message> = this.chatsStorageService.findLastMessageForChat(chat); 
     findLastMessageForChatPromise.then((data) => { 
      let message: Message = data; 
      chat.lastMessage = message; 
      chat.lastMessageCreatedAt = message.createdAt; 
      localChatCollection.insert(chat); 
     }); 
     } 
     resolve(localChatCollection); 
    }); 
    return promise; 
    } 

あなたが見ることができるようにthis.chatsStorageService.findLastMessageForChat約束が終了する前に、約束は、呼び出し元の関数に戻ります。 hereを読む

は、このソリューションを提供しています:

function workMyCollection(arr) { 
    return q.all(arr.map(function(item) { 
     return doSomethingAsync(item); 
    }));  
} 

しかし、私は私の活字体のコードを修正する方法がわかりません。

おかげ

答えて

1

は、ここでの問題は、以前の約束を待たずに、あなたのPromiseを解決しているあなたのresolve(localChatCollection)です。

解決する前にすべてのPromiseを配列に格納し、それらをすべて待つ必要があります。

私はタイプスクリプトを知らない文法について間違っていると翻訳してくれます。

private findLocalChatsWithLastMessageForChat(): Promise<Mongo.Collection<Chat>> { 
    let promise: Promise<Mongo.Collection<Chat>> = new Promise<Mongo.Collection<Chat>>(resolve => { 
     let localChatCollection: Mongo.Collection<Chat> = new Mongo.Collection<Chat>(null); 

     // ----------------- 
     // ARRAY OF PROMISES 
     let promises: Array<Promise> = []; 
     // ----------------- 

     for (let i: number = 0; i < this.chatsStorageService.chats.length; i++) { 
     let chat: Chat = this.chatsStorageService.chats[i]; 
     let findLastMessageForChatPromise: Promise<Message> = this.chatsStorageService.findLastMessageForChat(chat); 

     // ----------------- 
     // PUSH ALL YOUR PROMISES IN promises ARRAY 
     promises.push(findLastMessageForChatPromise); 
     // ----------------- 

     // Binding 'chat' in order to don't loose it. 
     findLastMessageForChatPromise.then(function (_chat, data) { 
      let message: Message = data; 
      _chat.lastMessage = message; 
      _chat.lastMessageCreatedAt = message.createdAt; 
      localChatCollection.insert(_chat); 
     }.bind(null, chat)); 
     } 

     // ----------------- 
     // WAIT FOR ALL PROMISES BEFORE RESOLVING 
     Promise.all(promises).then(function() {resolve(localChatCollection);}); 
     // ----------------- 

    }); 
    return promise; 
    } 
+0

ありがとうございます。 – Richard

+0

ハムを試してみましょう。あなたの 'chat'変数に何らかの問題があります。私の答えは –

+0

が更新されます;) 'chat'は今すぐOKです –