首页 文章

在Angular中避免嵌套的promise

提问于
浏览
0

我使用Eddy's nativescript-secure-storage plugin将多个变量存储在设备存储(NativeScript应用程序)中 .

每次存储值的调用都会返回一个promise:

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

    Per @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

    RezaRahmati的答案很可靠 .

    另一种方法是将承诺转换为可观察的 .

    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 */ }
    )
    
  • 1

    您可以使用 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);
       }
    }
    

相关问题