Javascript promise在switch语句中返回undefined

时间:2018-03-07 11:43:06

标签: javascript

很抱歉,如果此问题之前已经解决,我也检查了thisthis one(我认为这是一个很好的领导,但我没有理解接受的答案),最后this一个。

我在switch语句中有这种情况:

function setFieldTransformation(iteration) {

    //Omitting first hundred lines and switch declaration...
    case "customer.subscriptionSet":

        var subscriptionCode;

        if (iteration.oldValue && iteration.newValue) {

            if (Array.isArray(iteration.oldValue) && Array.isArray(iteration.newValue)) {
                subscriptionCode = iteration.oldValue[0].service;
            } else {
                subscriptionCode = iteration.oldValue.service;
            }
        } else if (iteration.oldValue) {
            if (Array.isArray(iteration.oldValue)) {
                subscriptionCode = iteration.oldValue[0].service;
            } else {
                subscriptionCode = iteration.oldValue.service;
            }
        } else {
            if (Array.isArray(iteration.newValue)) {
                subscriptionCode = iteration.newValue[0].service;
            } else {
                subscriptionCode = iteration.newValue.service;
            }
        }

        return getSubscriptionName(subscriptionCode);
        break;
}

我想要实现的目标:

我在这里检查订阅代码,然后调用此函数:

    function getSubscriptionName(subscriptionCode) {
        ServiceService.getService(subscriptionCode)
          .then(function(response){
             var subscriptionName = response.data.name
             return response.data.name;
        })
    }

调用服务来获取订阅名称。然后该字符串将通过此函数传递并打印在表格中:

function transformDetailValuesReworked(iteration) {
    //...
    var fieldSetTransformation = setFieldTransformation(iteration);
    return fieldSetTransformation;
}

实际发生的事情:

如果我正确理解了承诺的异步性质,var subscriptionName = response.data.name永远不会发生,所以返回undefined

我尝试了什么:

我尝试了一种链式承诺方法,但它的行为方式并不像我期望的那样。此外,虽然这不是一个好习惯,但我试图在功能中设置回调,但最终还是在同一个死角。

我非常确定我可以使用async function approach,但我担心兼容性问题。

你能说清楚吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您只是忘记从getSubscriptionName

返回任何内容
function getSubscriptionName(subscriptionCode) {
        return ServiceService.getService(subscriptionCode)
          .then(function(response){
             var subscriptionName = response.data.name
             return response.data.name;
        })
    }

但是接下来的方法需要将其视为异步

function transformDetailValuesReworked(iteration) {
    //...
    var fieldSetTransformation = setFieldTransformation(iteration);
    return fieldSetTransformation; // This is a promise not a value!
}