如何排列 jQuery 个延迟对象?
How to line up jQuery deferred objects?
我需要延迟每个 Ajax 调用,直到前一个函数 (hashcode.Sign()
) 完成。不幸的是,我的代码没有等到 hashcode.Sign()
完成,这就把一切都搞砸了,因为该函数创建了一个新会话,并且不能为了工作而覆盖它。我该怎么做?我是 Deferred 对象的新手,所以请原谅我缺乏知识。
for (var l = 0; l < fileArray.length; l++) {
var d = new jQuery.Deferred();
d.resolve(openDdoc(fileArray[l].url, $pid, fileArray[l].id));
d.done(function() { console.log('done'); });
}
function openDdoc(url, pid, fid) {
var def = new jQuery.Deferred();
$.when(def).done(function() { console.log('Function completed!'); });
def.resolve($.ajax({
url: '/open-ddoc',
type: 'post',
async: false,
data: {doc: url, pid: pid, fid: fid},
}).done(function (data) {
hashcode.Sign();
}).fail(function(data) {
console.log('this shit failed');
}));
}
hashcode.Sign()
函数包括更多 Ajax 调用和对其他函数的调用。如果需要,我可以稍后包含它。我知道我可以用 setTimeout()
解决所有这些问题,但这不是我的第一选择。
这不是很明显,但您寻求的顺序可以用 fileArray().reduce(...)
.
的形式表达
这个久经考验的模式在副标题 "The Collection Kerfuffle" 下概述 here。 (整篇文章非常值得一读)
fileArray.reduce(function(promise, file) {
return promise.then(function() {
return $.ajax({
url: '/open-ddoc',
type: 'post',
async: true, // <<<<< always TRUE!!
data: {doc: file.url, pid: $pid, fid: file.id}
});
}).then(function(data) {
console.log(file.id + ': done');
return hashcode.Sign(); // hashcode.Sign() must return a promise
});
}, $.when()) // <<<<< resolved promise to get the chain started
.then(function() {
console.log('all done');
});
在这种模式中,fileArray
的每个成员都被轮流(同步)访问,在每次访问时向不断增长的承诺链添加一个新的 .then()
。
已解决的启动承诺,$.when()
,导致构建的链开始稳定,ajax 调用按顺序进行。
ajax 调用不需要在单独的函数中,除非它将在其他地方调用。
需要强调的是hashcode.Sign()
(我们理解为异步)一定要写对returns有效承诺。如果不是,则结算过程无法确保其异步性在继续之前完成。
我需要延迟每个 Ajax 调用,直到前一个函数 (hashcode.Sign()
) 完成。不幸的是,我的代码没有等到 hashcode.Sign()
完成,这就把一切都搞砸了,因为该函数创建了一个新会话,并且不能为了工作而覆盖它。我该怎么做?我是 Deferred 对象的新手,所以请原谅我缺乏知识。
for (var l = 0; l < fileArray.length; l++) {
var d = new jQuery.Deferred();
d.resolve(openDdoc(fileArray[l].url, $pid, fileArray[l].id));
d.done(function() { console.log('done'); });
}
function openDdoc(url, pid, fid) {
var def = new jQuery.Deferred();
$.when(def).done(function() { console.log('Function completed!'); });
def.resolve($.ajax({
url: '/open-ddoc',
type: 'post',
async: false,
data: {doc: url, pid: pid, fid: fid},
}).done(function (data) {
hashcode.Sign();
}).fail(function(data) {
console.log('this shit failed');
}));
}
hashcode.Sign()
函数包括更多 Ajax 调用和对其他函数的调用。如果需要,我可以稍后包含它。我知道我可以用 setTimeout()
解决所有这些问题,但这不是我的第一选择。
这不是很明显,但您寻求的顺序可以用 fileArray().reduce(...)
.
这个久经考验的模式在副标题 "The Collection Kerfuffle" 下概述 here。 (整篇文章非常值得一读)
fileArray.reduce(function(promise, file) {
return promise.then(function() {
return $.ajax({
url: '/open-ddoc',
type: 'post',
async: true, // <<<<< always TRUE!!
data: {doc: file.url, pid: $pid, fid: file.id}
});
}).then(function(data) {
console.log(file.id + ': done');
return hashcode.Sign(); // hashcode.Sign() must return a promise
});
}, $.when()) // <<<<< resolved promise to get the chain started
.then(function() {
console.log('all done');
});
在这种模式中,fileArray
的每个成员都被轮流(同步)访问,在每次访问时向不断增长的承诺链添加一个新的 .then()
。
已解决的启动承诺,$.when()
,导致构建的链开始稳定,ajax 调用按顺序进行。
ajax 调用不需要在单独的函数中,除非它将在其他地方调用。
需要强调的是hashcode.Sign()
(我们理解为异步)一定要写对returns有效承诺。如果不是,则结算过程无法确保其异步性在继续之前完成。