function retRGObj(objName, xTime) {
return new Promise(
function (resolve, reject) {
let data = {}
findR(objName, xTime).then(function (msg) {
data.R = msg
console.log(data) //--> saves the expected value
}).then(findG(objName, xTime).then(function (msg) {
data.G = msg
console.log(data) //--> saves the expected value
}))
console.log(data) //--> all values are gone, returned value is "Object {}"
resolve(data)
})
}
我不知道如何无法返回最终值,它会在最后一个范围内被清空。怎么样/为什么?
答案 0 :(得分:1)
据推测,findR
和findG
异步工作 ;否则,他们回报承诺会很奇怪。所以你需要做的就是只有当这些承诺完成时才解决你的承诺。在您的情况下,这将在findG(...).then
的回调中。此外,您传递给findR(...).then
(findG
的返回值)的内容非常值得怀疑。
这是一个摆动,但当然这取决于细节:
// If they have to be nested (one after another)
function retRGObj(objName, xTime) {
return findR(objName, xTime).then((R) => {
return findG(objName, xTime).then((G) => {
return {R, G};
});
});
}
或者我们可以进一步压缩它,因为如果箭头函数中只有一个表达式并且它周围没有{}
,那么该表达式的结果就是它的返回值。所以(不是为了胆小的人!):
function retRGObj(objName, xTime) {
return findR(objName, xTime).then(
(R) => findG(objName, xTime).then(
(G) => ({R, G}) // Note: The () around {R, G} matter
)
);
}
在开始findR
之前等待findG
完成;我没有立即明白为什么这是必要的,因为我在findG
的调用中没有看到任何依赖findR
结果的内容。
如果它们可以并行,然后根据Bergi's comment更新我的早期版本,则可以执行此操作:
function retRGObj(objName, xTime) {
return Promise.all(
[findR(objName, xTime), findG(objName, xTime)]
).then(([R, G]) => {
return {R, G};
});
}
或浓缩:
function retRGObj(objName, xTime) {
return Promise.all(
[findR(objName, xTime), findG(objName, xTime)]
).then(([R, G]) => ({R, G}));
}