Promise 没有解析正确的值
Promise doesn't resolve the right value
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)
})
}
我不知道我怎么不能 return 最终值,它在最后一个范围内被清空。 How/why是吗?
据推测,findR
和 findG
工作 异步 ;否则,他们 return 的承诺会很奇怪。因此,您需要做的是仅在 您的 承诺完成时才解决这些承诺。在您的情况下,这将在 findG(...).then
的回调中。此外,您传递给 findR(...).then
(findG
的 return 值)的内容非常可疑。
这是一个摇摆,当然这取决于细节:
// 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};
});
});
}
或者我们可以进一步压缩它,因为如果箭头函数中只有一个表达式并且周围没有 {}
,那么该表达式的结果就是它的 return 值。所以(不适合胆小的人!):
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
.
的结果的东西
如果可以并发,那么在的基础上更新我之前的版本,可以这样做:
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}));
}
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)
})
}
我不知道我怎么不能 return 最终值,它在最后一个范围内被清空。 How/why是吗?
据推测,findR
和 findG
工作 异步 ;否则,他们 return 的承诺会很奇怪。因此,您需要做的是仅在 您的 承诺完成时才解决这些承诺。在您的情况下,这将在 findG(...).then
的回调中。此外,您传递给 findR(...).then
(findG
的 return 值)的内容非常可疑。
这是一个摇摆,当然这取决于细节:
// 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};
});
});
}
或者我们可以进一步压缩它,因为如果箭头函数中只有一个表达式并且周围没有 {}
,那么该表达式的结果就是它的 return 值。所以(不适合胆小的人!):
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
.
如果可以并发,那么在
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}));
}