2016-12-12 5 views
0

私はプロミスチェーニングをしようとしていますが、私はundefinedをチェーンの一部として得ています。問題は私がserviceFactory.GetProjectManager()を使用しているときのようです。私がそれを返すと、それは約束を返すようには見えないが、代わりにの解決された値で次の.then()に自動的に入る。promise chaining undefinedを返す

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を返す)という約束を返すよりもようです。

あなたが約束を返す関数にあなたのオリジナルのコールバックベースの機能をラップし、代わりにそれを呼び出すことができます。

Thenifyのように、自動的にこれを行います偉大なライブラリもあります
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 
    }) 

編集:ありがとうございましたBergi Angular.jsの約束がここでより意味をなさないと指摘しました。

+1

OPはネイティブ実装ではなくAngular promisesを使用する可能性が高いことに注意してください – Bergi