在模块化 JS 中使用 promises
Using promises with modular JS
我正在尝试在我的代码中应用模块化 JS 模式,但我很难实现承诺。我习惯于使用 "then" 在 1 行中承诺,但现在我有单独的函数,每个函数都在调用服务器并 returning 一个值给另一个函数,我不知道我是怎么做到的可以做到这一点。我很困惑如何同时使用完成和解决。
下面是我的代码:
//I want to call a function, makeLinksObject(), which will call the another function that calls the server
var formattedObject = makeLinksObject();
formattedObject.done(function (renderedObject) {
render(renderObject);
})
function makeLinksObject() {
//here I want to call another function that will call the server
var dfd = getLastTimeUpdated();
var linksArray = [];
var linksObject = {};
//get site updated date
dfd.done(function (dateUpdated) {
$.each(links, function (index, value) {
var linkObject = {};
obj.Title = value.Title.toLowerCase();
linksArray.push(obj);
});
linksObject = {
lblcallerId: "some value here"
links: linksArray
}
}); // end done
return dfd.resolve(linksObject);
}
function getLastTimeUpdated() {
var modificationUrl = "serverurl"
dfd = $.ajax({
url: modificationUrl,
method: "GET",
headers: {
"accept": "application/json;odata=verbose"
}
});
dfd.done(function(data){
dfd.resolve(data.d.LastItemModified);
})
return dfd.promise();
}
如何 return 函数 3 的服务器值用于函数 2,以及函数 2 的结果用于函数 1,然后我可以绘制我的 html 在函数 1.
目前,我在第二个函数中遇到错误,它无法识别我的延迟对象。
那时我想过写代码会嵌套,然后,但我想使用模块化代码来使我的代码井井有条。任何帮助,将不胜感激。
$.ajax()
return是一个jQuery promise对象,$.Deferred()
不是必须的,可以去掉;将 .then()
替换为 .done()
,其中您想 return 一个不同于 $.ajax()
的原始承诺值 return 的值,在函数中使用 return
调用和 .then()
。请注意,您还可以通过将 .fail()
链接到每个链中的最后一个 .then()
来将错误处理包含到模式中
var formattedObject = makeLinksObject();
formattedObject
.done(function(renderedObject) {
render(renderObject);
})
function makeLinksObject() {
var dfd = getLastTimeUpdated();
var linksArray = [];
var linksObject = {};
return dfd.then(function(dateUpdated) {
$.each(links, function(index, value) {
var linkObject = {};
obj.Title = value.Title.toLowerCase();
linksArray.push(obj);
});
linksObject = {
lblcallerId: "some value here",
links: linksArray
}
})
.then(function() {
return linksObject
});
}
function getLastTimeUpdated() {
var modificationUrl = "serverurl"
return $.ajax({
url: modificationUrl,
method: "GET",
headers: {
"accept": "application/json;odata=verbose"
}
})
.then(function(data) {
return data.d.LastItemModified;
})
}
我正在尝试在我的代码中应用模块化 JS 模式,但我很难实现承诺。我习惯于使用 "then" 在 1 行中承诺,但现在我有单独的函数,每个函数都在调用服务器并 returning 一个值给另一个函数,我不知道我是怎么做到的可以做到这一点。我很困惑如何同时使用完成和解决。
下面是我的代码:
//I want to call a function, makeLinksObject(), which will call the another function that calls the server
var formattedObject = makeLinksObject();
formattedObject.done(function (renderedObject) {
render(renderObject);
})
function makeLinksObject() {
//here I want to call another function that will call the server
var dfd = getLastTimeUpdated();
var linksArray = [];
var linksObject = {};
//get site updated date
dfd.done(function (dateUpdated) {
$.each(links, function (index, value) {
var linkObject = {};
obj.Title = value.Title.toLowerCase();
linksArray.push(obj);
});
linksObject = {
lblcallerId: "some value here"
links: linksArray
}
}); // end done
return dfd.resolve(linksObject);
}
function getLastTimeUpdated() {
var modificationUrl = "serverurl"
dfd = $.ajax({
url: modificationUrl,
method: "GET",
headers: {
"accept": "application/json;odata=verbose"
}
});
dfd.done(function(data){
dfd.resolve(data.d.LastItemModified);
})
return dfd.promise();
}
如何 return 函数 3 的服务器值用于函数 2,以及函数 2 的结果用于函数 1,然后我可以绘制我的 html 在函数 1.
目前,我在第二个函数中遇到错误,它无法识别我的延迟对象。
那时我想过写代码会嵌套,然后,但我想使用模块化代码来使我的代码井井有条。任何帮助,将不胜感激。
$.ajax()
return是一个jQuery promise对象,$.Deferred()
不是必须的,可以去掉;将 .then()
替换为 .done()
,其中您想 return 一个不同于 $.ajax()
的原始承诺值 return 的值,在函数中使用 return
调用和 .then()
。请注意,您还可以通过将 .fail()
链接到每个链中的最后一个 .then()
来将错误处理包含到模式中
var formattedObject = makeLinksObject();
formattedObject
.done(function(renderedObject) {
render(renderObject);
})
function makeLinksObject() {
var dfd = getLastTimeUpdated();
var linksArray = [];
var linksObject = {};
return dfd.then(function(dateUpdated) {
$.each(links, function(index, value) {
var linkObject = {};
obj.Title = value.Title.toLowerCase();
linksArray.push(obj);
});
linksObject = {
lblcallerId: "some value here",
links: linksArray
}
})
.then(function() {
return linksObject
});
}
function getLastTimeUpdated() {
var modificationUrl = "serverurl"
return $.ajax({
url: modificationUrl,
method: "GET",
headers: {
"accept": "application/json;odata=verbose"
}
})
.then(function(data) {
return data.d.LastItemModified;
})
}