承诺并没有解决正确的价值

时间:2015-06-09 18:16:57

标签: javascript promise es6-promise

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

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

1 个答案:

答案 0 :(得分:1)

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