【问题标题】:Javascript Promise Anti-patternJavascript Promise 反模式
【发布时间】:2016-10-12 08:16:47
【问题描述】:

我有一个Promise,但它没有按我的意愿工作,因为当我尝试使用数据时异步调用没有完成。

我一直在看 here 在 Promise ant-patterns,我相信这是我的解决方案。但是,因为我在 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 承诺完成之前,promise 返回到调用函数。

阅读here,提供了这个解决方案:

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

但是,我不知道如何修改我的 Typescript 代码。

谢谢

【问题讨论】:

    标签: javascript typescript promise


    【解决方案1】:

    这里的问题是您的 resolve(localChatCollection) 正在解决您的 Promise 而无需等待之前的承诺。

    您必须将所有 Promise 存储在一个数组中并等待它们全部解决。

    请注意,我不知道 TypeScript,如果我对语法有误,我会让你翻译。

     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;
      }
    

    【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多