Как избежать вложенных обещаний в Angular - PullRequest
0 голосов
/ 04 мая 2018

Я храню несколько переменных в хранилище устройства (приложение NativeScript), используя Плагин Eddy's nativescript-secure-storage .

Каждый вызов для сохранения значения возвращает обещание:

this.secureStorage = new SecureStorage();
secureStorage.set({
  key: "foo",
  value: "val1"
}).then(
  function(success) {
    //move on to the next one.
});

После сохранения нескольких значений мне нужно перейти в приложение к исходному виду, но сначала нужно убедиться, что значения были успешно сохранены.

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

this.secureStorage = new SecureStorage();
secureStorage.set({
  key: "foo1",
  value: "val1"
}).then(
  function(success) {
    secureStorage.set({
      key: "foo2",
      value: "val2"
  }).then(
    function(success) {
      secureStorage.set({
        key: "foo3",
        value: "val3"
    }).then(
       function(success) {
         //navigate to home view
    });
  });
});

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Реза Рахмати ответ твердый.

Другим способом было бы преобразование обещаний в наблюдаемые.

import { fromPromise } from 'rxjs/observable/fromPromise';
import { mergeMap } from 'rxjs/operators';

const secureStorage = new SecureStorage();
const store = (key, value) => fromPromise(secureStorage.set({key, value}));

Вот последовательный магазин:

store('foo1', 'value1')
   .pipe(
       mergeMap(() => store('foo2', 'value2')),
       mergeMap(() => store('foo3', 'value3'))
   ).subscribe(
      () =>  {/* Handle success */ }, 
      err => {/* Handle error*/ }
   )

Или эквивалент Promise.all(...):

forkJoin(
   store('foo1', 'value1'), 
   store('foo2', 'value2'), 
   store('foo3', 'value3')
).subscribe(
   ([foo1, foo2, foo3])=> { /* Success */ },
   err => { /* Error */ }
)
0 голосов
/ 05 мая 2018

за @johnrsharpe:

Promise 
    .all( [
        this.secureStorage.set({
           key: "foo1",
           value: "value1"
        }),
        this.secureStorage.set({
           key: "foo2",
           value: "value2"
        }),
        this.secureStorage.set({
           key: "foo3",
           value: "value3"
        })
    ])
    .then(success => {
        //navigate to home view
    });
0 голосов
/ 04 мая 2018

Вы можете использовать Promise.all([array of promises]) или использовать Typescript async / await

, так как вы пометили свой вопрос как Angular, я предполагаю, что вы используете Typescript 1.7+, тогда вы можете использовать этот способ

async storedata() {

   this.secureStorage = new SecureStorage();

   try {
     await secureStorage.set({
        key: "foo1",
        value: "val1"
     });
     await secureStorage.set({
        key: "foo2",
        value: "val2"
     });
     await secureStorage.set({
        key: "foo3",
        value: "val3"
     });

    //navigate to home view

   } catch(err) {
       console.error(err);
   }
}
...