Javascript 有了承诺,是否有一种机制可以访问.then()链中的最终返回值?

Javascript 有了承诺,是否有一种机制可以访问.then()链中的最终返回值?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,问题:对于承诺是否有机制访问链中的最终返回值 背景我需要对一个对象进行一系列检查/调整。一些检查是异步的,例如将数据与mongodb中存储的数据进行比较。因为有些检查是异步的,我相信承诺链可能是正确的选择。但是,由于检查必须按特定顺序进行Promise.all()将不起作用。如果在完成所有检查和调整后,有可能出现承诺链,我不确定如何从链中的最后一个中检索对象。然后()。也许我用了错误的工具来解决这个问题 下面的代码是一个简化的示例。myObject通过.then()语句链传递,但我不确定如何检索

问题:对于
承诺
是否有机制访问
链中的最终返回值

背景我需要对一个对象进行一系列检查/调整。一些检查是异步的,例如将数据与mongodb中存储的数据进行比较。因为有些检查是异步的,我相信
承诺
链可能是正确的选择。但是,由于检查必须按特定顺序进行
Promise.all()
将不起作用。如果在完成所有检查和调整后,有可能出现
承诺链,我不确定如何从链中的最后一个
中检索对象。然后()
。也许我用了错误的工具来解决这个问题

下面的代码是一个简化的示例。myObject通过
.then()
语句链传递,但我不确定如何检索最终更新的对象,或者这是否可能

功能承诺{
返回新承诺(功能(解决、拒绝){
设x={
名称:“超级复制者”,
随机数据一:10000,
第二组:5000
};
if(x){
决议(x);
}否则{
拒绝('uh-oh');
}
}); 
}
功能调整(myObject){
myObject.randomDataOne+=1000;
返回对象
}
功能二次调整(myObject){
myObject.randomDataTwo+=500;
返回myObject;
}
承诺
.然后(第一次调整)

.然后(第二次调整)我会尝试一下简化事情

注意:异步函数总是返回一个承诺。因此,为了获取数据,您需要在另一个异步函数中等待返回的数据,或者使用
then()
。我在下面的代码中给出了这两个示例

功能承诺{
返回新承诺(功能(解决、拒绝){
设x={
名称:“超级复制者”,
随机数据一:10000,
第二组:5000
};
//承诺设置为5秒后解决
if(x){
设置超时(()=>{
决议(x);
}, 5000)
}否则{
拒绝('uh-oh');
}
}); 
}
功能调整(myObject){
myObject.randomDataOne+=1000;
返回对象
}
功能二次调整(myObject){
myObject.randomDataTwo+=500;
返回myObject;
}
常量异步函数=async()=>{
const myObject=等待允诺
第一次调整(myObject)
第二次调整(myObject)
返回对象
}
//使用then()检索数据的示例
asyncFunction().then(res=>console.log(“使用then()的示例:”,res))
//在异步函数中检索数据的示例
常量anotherAsyncFunction=async()=>{
常量结果=等待异步函数()
log(“使用async()的示例:”,结果)
}
另一个异步函数()
//定时器倒计时承诺解决
让计数=1
常量计时器=设置间隔(()=>{
console.log(count++)
如果(计数>4)清除间隔(计时器)

},1000)
promisesPromises()。然后(第一次调整)。然后(第二次调整)。然后(结果=>console.log(结果))-tada-你已经进入了决赛result@JaromandaX是。在.then()链中进行每次调整后,最终值将是myObject。在实际版本中,它可能是8或10。然后()块。“return”它在哪里?您在
中使用它。然后
-它在异步外部不(安全)可用。然后链。。。由于asynchrony@Barmar,
firstAdjustment
不需要返回承诺,这就是承诺链。为什么会这样?@Barmar,是的,但是承诺链仍然是一个承诺链,即使其中的每个then回调返回值而不是承诺。谢谢你的方法!但直到我读到@JaromandaX的一条评论,我才意识到即使我能得到返回值,我也不能在常规同步代码中安全地使用它,因为我无法预测异步部分需要多长时间。我从这个问题中学到了很多@使用
async/await
进行堆栈和溢出可以提供更多的控制。当您等待时,代码会在该点暂停,然后继续。为了证明这一点,我更新了代码,使承诺在5秒后得到解决。正如您将看到的,在返回来自
asyncFunction()
的已解析承诺之前,不会触发
console.log()
内部的
anotherAsyncFunction()
。这为您提供了处理从API调用接收的数据的强大能力。