如何使用promise.all在ES6 / Typescript / Angular中的多个if语句之后返回?

时间:2017-04-21 21:34:53

标签: javascript angular typescript ecmascript-6 es6-promise

我有一个存储加载功能,我希望有一个承诺,在这个功能中,我需要从设备加载几个项目,等待所有项目完成后再解析。

当前加载函数返回一个从存储中加载数据的promise。

我想做的是:

Init(){
    platform.ready()
        .then(() => this.platformTest())
        .then(() => this.otherTest())
        .then(() => this.anotherTest()
        .then(() => this.storageLoad())
        .catch(error => console.log(error);
}

storageLoad(){
    return new Promise(resolve => {
        if (this.platform == 'android'){
            //do android specific stuff
        }
        if (this.platform == 'ios'){
            //do ios specific stuff
        }
        storage.get(x)
        .then(data => this.x = data);
        storage.get(y)
        .then(data => this.y = data);
    }

}

但是我不知道如何等到所有这些都加载或放置解析功能。我试过谷歌搜索,但我很难理解ES6的承诺。

对此主题的任何亮点都会非常感激。

1 个答案:

答案 0 :(得分:1)

Promise.all()(简化)的工作方式如下:你传递一个Promises数组。我们称之为“输入承诺”。它会返回一个新的Promise - 一个“输出Promise”。

(从技术上讲,你不必传递一个也不必包含Promises的数组,但这里的实现细节不太重要。)

如果成功解析了所有输入Promise,则输出Promise将使用包含已解析输入Promises值的数组进行解析。

如果任何传递的输入Promises失败,则输出Promise将被拒绝。

我认为你的问题是关于你的第二种方法。

您实际上不需要在那里运行new Promise。相反,将两个存储方法执行传递给Promise.all()并返回。

因为没有function关键字,我认为这是来自类上下文。如果你提到的话会让事情变得更容易掌握。

storageLoad() {
  if (this.platform == 'android'){
    //do android specific stuff
  }
  if (this.platform == 'ios'){
    //do ios specific stuff
  }
  const storageX = storage.get(x)
    .then(data => this.x = data);
  const storageY = storage.get(y)
    .then(data => this.y = data);

  return Promise.all([ storageX, storageY ])
}

希望这有帮助。

更新:

要有条件地在Promise.all()中使用Promises,只需构建动态传递给它的Promise数组。像这样:

storageLoad() {
  // Create a new array with Promises
  const storageProcesses = [];

  if (this.platform == 'android'){
    //do android specific stuff
    storageProcesses.push(someAndroidSpecificStorageMethod());
  }
  if (this.platform == 'ios'){
    //do ios specific stuff
    storageProcesses.push(someIOSSpecificStorageMethod());
  }

  storageProcesses.push(storage.get(x)
    .then(data => this.x = data));
  storageProcesses.push(storage.get(y)
    .then(data => this.y = data));

  return Promise.all(storageProcesses)
}