Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在ES6/Typescript/Angular中的多个if语句之后使用promise.all返回?_Javascript_Angular_Typescript_Ecmascript 6_Es6 Promise - Fatal编程技术网

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

Javascript 如何在ES6/Typescript/Angular中的多个if语句之后使用promise.all返回?,javascript,angular,typescript,ecmascript-6,es6-promise,Javascript,Angular,Typescript,Ecmascript 6,Es6 Promise,我有一个存储加载功能,我希望有一个承诺,在这个功能中,我需要从设备加载几个项目,并等待所有项目完成后再解决 用于加载的当前函数返回从存储器加载数据的承诺 我想做的是: Init(){ platform.ready() .then(() => this.platformTest()) .then(() => this.otherTest()) .then(() => this.anotherTest() .t

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

用于加载的当前函数返回从存储器加载数据的承诺

我想做的是:

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);
    }

}
但我不知道如何等到所有这些都加载完毕,或者在哪里放置resolve函数。我尝试过谷歌搜索,但我很难理解ES6的承诺

任何关于这个主题的信息都将不胜感激。

Promise.all()
(简化)的工作原理如下:你向它传递一系列承诺。让我们称之为“投入承诺”。它还返回了一个新的承诺——“输出承诺”

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

如果成功解析了所有输入承诺,则将使用包含已解析输入承诺值的数组解析输出承诺

如果任何传递的输入承诺失败,则输出承诺将被拒绝


我想你的问题是关于你的第二种方法

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

因为没有
函数
关键字,所以我假设这是来自类上下文。如果你提到这一点,事情会更容易理解

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()
中的承诺,只需构建动态传递给它的承诺数组。像这样:

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)
}

但是您已经在问题的标题中写道,您可以使用
Promise.all
。我正在寻找如何做到这一点,我不理解或找不到示例。请尝试
Promise.all([storage.get(x).然后(…),storage.get(y).然后(…)))。然后(解决,拒绝)
但是为什么要将数据存储在
中?为什么不用数据来解决这个承诺呢?因为这个.x实际上不是这个.x,我只是不想添加更多我认为必要的代码。我正在将所有返回的数据存储在所有typescript文件之间的共享服务中。对不起,我对typescript非常陌生,我甚至对类上下文都不是100%熟悉。如果我在If语句中从存储中加载某些内容,我将如何将它们包含在代码段底部的Promise.all()语句中?谁是“它们”?而且:对于“类上下文”,我的意思是你的函数缺少一个
函数
关键字。通常只有当它们是类中的方法时才会发生这种情况。在本文中,它们是我在前半句中提到的if语句。哦,好的。不知怎的忽略了你的前半句话关于这个场景,我在回答中添加了另一个例子。Augie,记住javascript上下文中没有“类”。一切都是一个对象,包括所有函数和变量,基本值除外。