2016-12-12 179 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