Próbuję utworzyć funkcję opakowującą, która zwraca obiekt Promise, który zostanie rozwiązany po rozwiązaniu wewnętrznej Promise. Zasadniczo coś takiego:

function wrapper() {
  return new Promise((resolve, reject) => {
    MyApi.asyncCall()
      .then(data => {
        // do this first, then resolve outer promise
        resolve();
      })
      .catch(e => {
        reject();
      });
  });
}

Powodem, dla którego muszę to zrobić, jest to, że mam interfejs, który akceptuje argument dotyczący obietnicy, a następnie uruchamia akcję, gdy ta obietnica zostanie rozwiązana. Muszę wykonać wywołanie asynchroniczne, a następnie zrobić coś z odpowiedzią, a następnie uruchomić interfejs.

Edytuj Wyjaśnienie celu: Muszę wykonać działania w odpowiedzi na wewnętrzną obietnicę PRZED wypełnieniem zewnętrznej obietnicy. Interfejs akceptuje nierozwiązany obiekt obietnicy, a następnie montuje komponent po rozwiązaniu. Jeśli spełnię wewnętrzną obietnicę, zostanie ona zamontowana przed wykonaniem działań dotyczących odpowiedzi na dane.

0
mhatch 1 kwiecień 2020, 23:05

3 odpowiedzi

Najlepsza odpowiedź

Zasadniczo - robisz to dobrze. Kiedy potrzebujesz, jesteś zdecydowany / odrzucasz obietnicę.

Ale możesz to łatwo zrobić - po prostu zwróć oryginalną obietnicę:

function wrapper() {
  return MyApi.asyncCall()
}

Więc twoja obietnica zwrotu, która zostaje rozwiązana lub odrzucona, gdy MyApi.asyncCall rozwiązuje się lub odrzuci.

Jeśli potrzebujesz pomocy w środku, możesz to zrobić w ramach tej obietnicy:

function wrapper() {
  return MyApi.asyncCall()
    .then((data) => {
      doSomeOtherStaff(data)
      return data
    })
}

Pamiętaj, że jeśli potrzebujesz danych na zewnątrz - musisz je zwrócić ze swojego wewnętrznego wywołania zwrotnego.

1
Aleksandr Petrov 1 kwiecień 2020, 20:15

Czy możesz wyjaśnić, dlaczego dokładnie potrzebujesz obietnicy opakowania?

MyApi.asyncCall()
      .then(data => {
        // do this first, then resolve outer promise
        resolve();
      })
      .catch(e => {
        reject();
      });

Jest obietnicą samą w sobie i powinno wystarczyć, aby ją po prostu zwrócić.

0
Marco Link 1 kwiecień 2020, 20:14

Możesz użyć asynchronicznego oczekiwania na pierwszą obietnicę, a po uzyskaniu danych pierwszej obietnicy zwróć drugą obietnicę:

function wrapper(){
  return new Promise( async   (resolve,reject)=>{
   let myFirstPromise =  await firestPromise();
   // do your stuff here
   console.log(myFirstPromise)
   return resolve('Second Promise');
  });
}

function firestPromise(){
  return new Promise( (resolve,reject)=>{
   return resolve('First Promise');
  });
}
0
arman codex 1 kwiecień 2020, 20:24