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