我們有一個正在增長的應用程序,我們的客戶端腳本需要被重構爲更清潔,更精簡和更易於維護。我正試圖利用一個小模塊來利用承諾鏈接庫。如何轉換爲使用Promises和Q庫
正如你所看到的,我需要將一些返回值從初始函數傳回給promise鏈的其餘部分。 有人可以幫助我瞭解我需要做什麼才能讓第一個函數正確返回作爲承諾嗎?然後解釋鏈?
這裏是我的出發點:
var promise = new Q.Promise(generateMoveRequest)
.then(function (id) {
var woNum = 12345;
return layoutInit(woNum, id, true);
}).then(function (result) {
if (result) {
return moveRequestInit(result, true);
} else {
throw new Error('Template not loaded');
}
}).catch(function (err) {
console.log(err);
});
生成移動請求:
generateMoveRequest: function() {
$.ajax({
method: "GET",
url: window.contextPath + '/api/settings/getjson',
data: {name: "the_name"},
success: function (data) {
if (data.length) {
var id = $.parseJSON(data).Parent;
return id;
}
},
error: function (xhr, textStatus, errorThrown) {
console.log("xhr: ", xhr);
return null;
}
});
}
佈局初始化:
layoutInit: function (num, id, appendLayout) {
$.ajax({
method: "GET",
url: window.contextPath + '/some/url',
data: {num: num, id: id},
success: function (data) {
return layoutInit.callback(data, appendLayout);
},
error: function (xhr, textStatus, errorThrown) {
console.log("xhr: ", xhr);
}
});
},
callback: function (data, appendLayout) {
if (data && data.toString().toLowerCase() !== "blank") {
if (appendLayout) {
$(data).insertBefore($("#detailsection"));
} else {
$("#detailsection").html(data);
}
} else {
$("#detailsection").html('');
}
},
的generateMoveRequest函數將執行,但鏈永遠不會繼續。沒有。然後()執行和layoutInit永遠不會被調用。
我正在使用Q庫,但一些例子似乎忽略瞭如何開始/創建承諾或將初始函數轉化爲Promise。
有人可以解釋我在這裏有什麼錯,或爲我提供一個乾淨的例子嗎?
你的函數'generateMoveRequest'應該返回的東西:'$ .ajax'返回一個承諾(它有一個'then'方法),所以你可以返回。 – trincot
@trincot我讓它返回一個值=> id – Encryption
這是成功回調的返回值,而不是函數'generateMoveRequest'。 – trincot