【发布时间】:2017-04-04 04:56:36
【问题描述】:
我们有一个正在增长的应用程序,我们的客户端脚本需要重构,使其更简洁、更精简和更易于维护。我正在尝试将一个小模块用于利用 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 函数将执行,但链不再继续。没有 .then() 执行和 layoutInit 永远不会被调用。
我正在使用 Q 库,但其中一些示例似乎忽略了如何启动/创建 Promise 或将初始函数转换为 Promise。
有人可以解释我在这里有什么问题或提供一个干净的例子吗?
【问题讨论】:
-
你的函数
generateMoveRequest应该返回一些东西:$.ajax返回一个promise(它有一个then方法),所以你可以直接返回。 -
@trincot 我让它返回一个值 => id
-
那是成功回调的返回值,而不是函数
generateMoveRequest的返回值。
标签: javascript jquery promise q