2014-07-11 172 views
0

我想在使用一系列請求將其綁定到我的視圖之前構建模型。我很難理解如何利用一個請求的響應來提出下一個請求。我的問題是我的「贊助商」和「經理」屬性是作爲承諾解決的,而不是響應。適當的承諾鏈接

$.get("/projects/1") 
.then(function(data){ 
    var manager = $.get("/employees/" + data.ProjectManagerId); 

    data.manager = manager; 
    return data; 
}) 
.then(function(data){ 
    var sponsor = $.get("/employees/" + data.ProjectSponsorId); 

    data.sponsor = sponsor; 
    return data; 
}) 
.then(function(data){ 
    //Bind data to view 

    //data.manager is a promise 
    //data.sponsor is a promise 
}) 
.done(); 

如何確保數據返回,而不是承諾?

+0

你知道,這是標記Q,但這裏沒有一個Q承諾嗎? –

+0

謝謝本。我在我的應用程序中使用Q,但最終刪除了我簡化示例中的引用。我將刪除標籤。 – jjr2527

回答

1

它在我看來像經理和贊助商的請求可以並列(同時執行)。

我在那裏拍一個when

$.get("/projects/1") 
.then(function(data){ 
    var manager_req = $.get("/employees/" + data.ProjectManagerId); 
    var sponsor_req = $.get("/employees/" + data.ProjectSponsorId); 

    return $.when(data, manager_req, sponsor_req); 
}) 
.then(function(data, manager, sponsor){ 
    data.sponsor = sponsor; 
    data.manager = manager; 
    return data; 
}) 
.done(function(data){ 
    //Bind data to view 

    //data.manager is resolved 
    //data.sponsor is resolved 
}); 

嵌套時承諾涉及一點點更好地與data

$.get("/projects/1") 
.then(function(data){ 
    var manager_req = $.get("/employees/" + data.ProjectManagerId); 
    var sponsor_req = $.get("/employees/" + data.ProjectSponsorId); 

    return $.when(manager_req, sponsor_req).then(function(manager, sponsor){ 
    data.sponsor = sponsor; 
    data.manager = manager; 
    return data; 
    }); 
}) 
.done(function(data){ 
    //Bind data to view 

    //data.manager is resolved 
    //data.sponsor is resolved 
}); 
+0

是否在請求退出時等待完成,然後才允許退貨?看起來這就是我錯過的一點,雖然我同意這個平行位。 – jjr2527

+1

'$ .get'完成請求。 '$ .when'只是同步這兩個請求。它返回一個promise,它在輸入被解析時解析。如果輸入不是承諾(如第一個樣本中的「數據」),則它計算爲已解決的值。 – Halcyon