Как я могу преобразовать возвращенный объект в обещание с объектом? - PullRequest
2 голосов
/ 07 июня 2019

У меня есть вызов API, который возвращает либо обещание, либо объект с информацией.

getFollowers(uid, auth){
    if(uid){
      var followersPromise =  this.db.collectionGroup(`following`)
      ....
      })
        .catch(function(error) {
          ...
      });
      return followersPromise
    }else{
      return {success: 0, error: "Item missing"}
    }
  }

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

Если это достойный подход, как мне его достичь?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Существует два подхода:

  1. Если код, инициирующий операцию, даже не может ее запустить, разумно выдать ошибку.Это было бы синхронно.

  2. В ситуациях, когда асинхронный процесс уже выполняется, и вы делаете это, или если вы просто предпочитаете, чтобы функция никогда не выдавала и всегда возвращала обещание, используйтеPromise.reject:

    return Promise.reject(new Error("Item missing"));
    

(Вам не нужно использовать Error с Promise.reject, как вам не нужно с throw, но этоЛучшая практика в обоих случаях.)


Два других комментария к getFollowers:

  1. В общем, если у вас уже есть обещание работать, например,с this.db.collectionGroup в этом случае не используйте new Promise.Просто цепочка от этого обещания.Подробнее см. ответы на этот вопрос .

  2. В вашем вопросе я вижу, что getFollowers имеет обработчик .catch.Обычно это не подходит, если функция возвращает обещание.Просто позвольте ошибке распространяться.

Поэтому, если вы хотите сделать синхронную ошибку, когда вы даже не можете инициировать операцию:

getFollowers(uid, auth){
    if(!uid){
        throw new Error("Item missing");
    }
    return this.db.collectionGroup(`following`)
        // ....
    });
}

, если вы предпочитаетевместо этого использовать отклоненное обещание:

getFollowers(uid, auth){
    return !uid
        ? Promise.reject(new Error("Item missing"))
        : this.db.collectionGroup(`following`)
            // ....
        });
}
0 голосов
/ 07 июня 2019

Вот для чего Promise.resolve:

 return Promise.resolve({success: 0, error: "Item missing"});

Или вы можете просто сделать функцию асинхронной:

 async getFollowers(uid, auth){
   if(uid) {
     try {
      const result =  await this.db.collectionGroup(`following`);
      return result;
     } catch(error) {
       //  ...
     }
  } else {
    return {success: 0, error: "Item missing"}
  }
}
...