承诺链接返回undefine

时间:2016-12-12 23:28:16

标签: javascript angularjs promise

我正在尝试进行承诺链接,但我正在获取undefined我链中的一部分而且我不确定为什么。问题似乎是在我使用serviceFactory.GetProjectManager()时。当我返回时,它似乎没有返回承诺,而是自动进入下一个.then(),其解析值为undefined

如果GetProjectManager返回一个字符串,并且我从函数调用返回它,它是否会将它包装在一个promise中并传递给下一个promise链?

  dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId;
    }).then(function(projectId){
        return serviceFactory.GetProjectManager(projectId);
    })
    .then(function(result){
        //GET UNDEFINED HERE <---------
    })
    .catch(function(error){

    });

如果我编写如下代码,那么它将在回调中返回正确的值,但我不想使用回调,我想使用扁平化的promise链接。

dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId;
    }).then(function(projectId){
        serviceFactory.GetProjectManager(projectId
            ,function(result){
                //Returns Project Manager Here <----
            }
            ,function(error){

        });
    })
    .catch(function(error){

    });

1 个答案:

答案 0 :(得分:1)

正如您在评论中指出的那样,GetProjectManager似乎接受回调(并返回undefined)而不是返回承诺。

您可以将原始基于回调的函数包装到一个返回promise的函数中,然后调用它:

function GetProjectManagerAsync (serviceFactory, projectId) {
    return $q(function (resolve, reject) {
        serviceFactory.GetProjectManager(projectId, resolve, reject)
    })
}

dataFactory.GetProject()
    .then(function(result){
        return result.Response.ProjectId
    })
    .then(function (projectId){
        return GetProjectManagerAsync(serviceFactory, projectId)
    })
    .then(function (projectManager) {
        // do something neat with `projectManager`
    })
    .catch(function (error){
        throw error // or do real error handling
    })

还有很棒的图书馆会自动为您执行此操作,例如Thenify

修改:感谢Bergi指出Angular.js承诺在这里更有意义。