2016-12-12 176 views
0

我试图做承诺链接,但我得到undefined为我的链中的一部分,我不确定为什么。这个问题似乎是当我使用serviceFactory.GetProjectManager()。当我回复它时,似乎没有返回承诺,而是自动进入下一个.then(),解决的值为undefined承诺链接返回undefine

如果GetProjectManager返回一个字符串,我从函数调用返回它不会包装它在一个承诺,并传递给下一个承诺链?

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

    }); 

如果我写类似下面的代码,那么它将返回回调正确的价值,但我不希望使用回调我想用扁平承诺链接。

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

serviceFactory.GetProjectManager是否返回承诺,还是只接受回调作为参数? –

+0

它只接受回调,我想这一定是承诺链接不起作用的原因? – FillyPajo

+1

好猜@FilipJuristovski –

回答

1

当您在评论中指出,GetProjectManager似乎接受回调(和返回undefined),而不是返回一个承诺。

你可以用你原来的基于回调的函数到返回一个承诺的功能,并调用来代替:

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的承诺会在这里更有意义。

+1

请注意,OP可能使用Angular promise而不是本地实现 – Bergi