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是吗?

据推测,findRfindG 工作 异步 ;否则,他们 return 的承诺会很奇怪。因此,您需要做的是仅在 您的 承诺完成时才解决这些承诺。在您的情况下,这将在 findG(...).then 的回调中。此外,您传递给 findR(...).thenfindG 的 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}));
}