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

我不知道我怎么不能返回最终值,它在最后一个范围内被清空。如何/为什么?

4

1 回答 1

1

大概,findR并且异步findG工作;否则,他们返回承诺会很奇怪。因此,您需要做的是仅在这些承诺完成时才解决您的承诺。在您的情况下,这将在. 此外,您传递的内容(的返回值)是高度可疑的。findG(...).thenfindR(...).thenfindG

这是一个摇摆,但当然这取决于细节:

// 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 的评论更新我的早期版本,您可以这样做:

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}));
}
于 2015-06-09T18:20:25.553 回答