我正在尝试进行承诺链接,但我正在获取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){
});
答案 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承诺在这里更有意义。