Javascript 是否可以使用一个wait关键字来解析一组连续承诺
也许这是语言的一个局限性,但我正试图找出如何使用单个Javascript 是否可以使用一个wait关键字来解析一组连续承诺,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,也许这是语言的一个局限性,但我正试图找出如何使用单个await关键字来获得一组连续的承诺解决方案。我正在努力实现可读性,如以下内容: const-workoutExercises=等待训练。获取(1)。workoutExercises; Workout.get访问数据库,并返回一个Promise。promise解析为Workout的实例,该实例在名为workoutExercises的实例上具有getter方法,该方法也是解析为WorkoutExercise的数组的promise 上述代码不起作
await
关键字来获得一组连续的承诺解决方案。我正在努力实现可读性,如以下内容:
const-workoutExercises=等待训练。获取(1)。workoutExercises;
Workout.get
访问数据库,并返回一个Promise
。promise解析为Workout
的实例,该实例在名为workoutExercises
的实例上具有get
ter方法,该方法也是解析为WorkoutExercise
的数组的promise
上述代码不起作用,只等待训练。获取以解决问题;也不必等待.workoutExercises
解决。下面的代码示例确实有效,但我正在尝试实现一行代码/更高的可读性:
1:
const-workoutExercises=wait(wait-Workout.get(1)).workoutExercises;
2:
const-workout=wait-workout.get(1);
const workoutExercises=等待锻炼。workoutExercises;
编辑#1
更新了标题和说明,以澄清问题不在于承诺链的解决,而在于基于先前承诺的解决的承诺的解决
Workout.get-->-->Workout-->.workoutExercises-->-->所需结果
使用。然后()对的结果进行。get(1)
,并提取workoutExercises
。一行是非常可读的
例如:
(异步()=>{
常量训练={
获取:()=>Promise.resolve({
练习:承诺。决心(3)
})
};
const workoutExercises=等待锻炼。获取(1)。然后(w=>w.workoutExercises);
控制台日志(训练练习)
})()
是否可以使用一个wait关键字来解析一组连续承诺
因为这些承诺实际上并没有被束缚,事实并非如此。您有一个承诺,它解析为一个对象,该对象有一个属性,当您访问它时,它有一个getter,该getter创建一个新的承诺,该承诺解析为您最终想要的值。这是两个完全不同的承诺,您必须在这两个承诺中的每一个上使用await
或.then()
,这样您就不能用一个await
来实现这一点
您可以使用一些中间代码将它们链接在一起,甚至将它们放入一个helper函数中:
function getWorkoutExercises(n) {
return Workout.get(n).then(workout => {
// chain this promise to the previous one
return workout.workoutExercises;
});
}
// usage
getWorkoutExercises(1).then(exercises => {
console.log(exercises);
}).catch(err => {
console.log(err);
});
或
如果Workout.get(1)
返回一个承诺,那么它就不会有.workoutexercise
方法。。。它应该有。然后
和。catch
——至少,这就是标准承诺的工作原理。这不是一系列承诺。它是一个承诺,解析为一个对象,该对象具有一个作为getter的属性,该getter在被访问时创建另一个承诺。从任何定义来看,这都不是承诺链。这里的问题是,您尝试执行的操作的界面很差。您必须使用多个wait
语句或多个.then()
处理程序来处理它。如果语法真的困扰你,你可以做一个小助手函数来帮你做一些不必要的工作。
// usage
try {
let exercises = await getWorkoutExercises(1);
console.log(exercises);
} catch(e) {
console.log(e);
}