我有一个存储加载功能,我希望有一个承诺,在这个功能中,我需要从设备加载几个项目,等待所有项目完成后再解析。
当前加载函数返回一个从存储中加载数据的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的承诺。
对此主题的任何亮点都会非常感激。
答案 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)
}