Javascript承诺在switch语句中返回未定义的

Javascript承诺在switch语句中返回未定义的,javascript,Javascript,对不起,如果这个问题以前已经解决了,我也检查过(我认为这是一个很好的线索,但我没有理解接受的答案),最后一个 我在switch语句中有这样一个例子: function setFieldTransformation(iteration) { //Omitting first hundred lines and switch declaration... case "customer.subscriptionSet": var subscriptionCode;

对不起,如果这个问题以前已经解决了,我也检查过(我认为这是一个很好的线索,但我没有理解接受的答案),最后一个

我在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

我尝试过的:

我尝试过一种连锁承诺的方法,但它的行为方式与我预期的不同。此外,尽管这不是一个好的实践,我也尝试在函数中设置回调,但最终还是在同一个死区结束

我很确定我可以使用,但我担心兼容性问题


你能解释一下吗?谢谢。

您只是忘记了从
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!
}

getSubscriptionName
需要一个
return
getSubscriptionName
不返回任何内容。您需要
返回ServiceService.getService(…)
,这使得它返回一个承诺,然后您需要在
TransformDetailValuesWorked
中用
setFieldTransformation(迭代)链接该承诺。然后(函数(fieldSetTransformation){…})
。考虑到函数在
transformDetailValuesReworked
中的使用方式,我认为他们不会忘记承诺是如何工作的…@deceze我也得到了更新,但dupe是正确的!你好,谢谢你的回答。我正在尝试Promise对象方法:
函数getSubscriptionName(subscriptionCode){var subscriptionName;返回新的Promise(函数(解析,拒绝){ServiceService.getService(subscriptionCode)};}
,但是这不起作用。我遗漏了什么?@wickedchild您根本不需要这样做-只需根据我的回答添加返回语句即可。但作为对这一直接评论的回答,你并没有兑现承诺。