【发布时间】:2015-07-24 03:32:40
【问题描述】:
我想知道是否有办法按顺序和有条件地执行延迟任务。也就是说,我想按顺序执行一些异步任务,我只会根据前一个的结果执行下一个。 Promise 链的结果应该是最后执行的。
知道如何使用延迟的 Jquery 来修补它。
编辑:
在我正确理解 ajax 调用之前,我为一个函数启动了以下代码,该函数验证一个值不在另一个值的相关值中。
function findBroaderOrNarrowerConceptInFieldSelectedList(field, value) {
var intputfields = $("#instance_" + field + "_wrapper" + " .ds-authority-value")
if (intputfields.length == 0)
return undefined;
//go over each input field and retreive the value
for (var i = 0; i < intputfields.length; i++) {
//check if our value is in the broader concepts of the input field concept
//if true return the wrapper element, if false next steps
if (is_broader_concept(value.id, $(intputfields[i]).attr('value'))) {
var WrapperdivId = "#" + $(intputfields[i]).attr('name').replace("_authority", "") + "_wrapper";
return $($(WrapperdivId)[0]);
}
//check if our value is in the narrower concepts of the input field concept
//if true return the wrapper element
if (is_narrower_concept(value.id, $(intputfields[i]).attr('value'))) {
var WrapperdivId = "#" + $(intputfields[i]).attr('name').replace("_authority", "") + "_wrapper";
return $($(WrapperdivId)[0]);
}
}
return undefined
}
问题是我的 is_broader_concept 看起来像这样:
function is_broader_concept(broaderuri, concepturi) {
return getBroaderConcepts(concepturi).then(function(data, textStatus, jqXHR ) {
var broaders = data
if (broaders.length == 0)
return false;
for (var i = 0; i < broaders.length; i++) {
if (broaders[i].uri == broaderuri)
return true;
}
});
}
现在我已经了解了 deferred 和 promise(不是很新,因为我在 scala 中做过(promise 和 future)),我想调整我的第一个方法来使用 deferred。但是我没有看到任何可以帮助我轻松实现我想要的结构。
EDIT2:
我发现以下库非常好,以防您启动许多并行任务。事实上,它可以在第一个成功的情况下返回。这是对When的修改。虽然我认为不必打电话给所有这些人会很好
https://github.com/terrycojones/jquery-when2
EDIT3:
我更多的是寻找一个完全没有错误的库,可以在 https://codereview.stackexchange.com/questions/38420/sequential-function-call-in-javascript 或 Conditionals on a chained deferred in jquery 中执行类似操作
EDIT4:根据@Roamer-1888 的响应进行更新
正确的 is_broader 和较窄的适用于他的解决方案
function is_broader_concept_Promise(broaderuri, field) {
var uri = field.value.substr(field.value.indexOf("http://"));
return getBroaderConcepts(uri).then(function(data, textStatus, jqXHR ) {
var broaders = data;
if (broaders.length == 0)
return $.Deferred( function( d){ d.reject(); }).promise();
for (var i = 0; i < broaders.length; i++) {
if (broaders[i].uri == broaderuri)
return field;
}
return $.Deferred( function( d){ d.reject(); }).promise();
});
}
function is_narrower_concept_Promise(narroweruri, field) {
var uri = field.value.substr(field.value.indexOf("http://"));
return getNarrowerConcepts(uri).then(function(data, textStatus, jqXHR ) {
var narrowers = data;
if (narrowers.length == 0)
return $.Deferred( function( d){ d.reject(); }).promise();
for (var i = 0; i < narrowers.length; i++) {
if (narrowers[i].uri == narroweruri)
return field;
}
return $.Deferred( function( d){ d.reject(); }).promise();
});
}
非常感谢,
中号
PS:我大约一个月前开始使用 jQuery。
【问题讨论】:
-
把你的例子(或任务)带到桌面
-
顺序任务从何而来?您如何/在哪里打电话给
is_broader_concept()? -
在“findBroaderOrNarrowerConceptInFieldSelectedList”的“for”里面
-
"getBroaderConcepts(concepturi)" 是异步 ajax 调用完成的地方。