使用jQuery Deferred查找第一个可用的数据源

Par*_*ris 5 javascript jquery jquery-deferred

所以我在接受采访时被问到这个问题,但它提出了一个很好的用例.假设您有一堆数据源.你想找到第一个可用的并处理它而忽略其余的.

所以类似于:

var datasources = new Array("somedatabase1/pizza","somedatabase2/beer","somedatabase3/llama");
var dfds = new Array();
$.each(datasources,function(source){
    dfds.push($.getJSON(source));
});

$.when(dfds).done(function(){alert("they are all done");});
Run Code Online (Sandbox Code Playgroud)

忽略我真的不认为什么时候接受一个数组(也许它).这当然会让它等到它们全部完成.我正在寻找一些代码,让它等到一个,其中任何一个完成,然后不用担心其他的.

我被告知它只能递归地工作.

Esa*_*ija 3

这不使用递归,但满足从多个数据源获取的要求,并且只关心第一个返回成功响应的数据源。

\n\n

http://jsfiddle.net/mNJ6D/

\n\n
function raceToIt(urls) {\n    var deferred = $.Deferred(),\n        promises;\n\n    function anyComplete(data) {\n        if (!deferred.isResolved()) {\n            deferred.resolveWith(this, [data]);\n            promises.forEach(function(promise) {\n                promise.abort();\n            });\n        }\n    }\n    promises = urls.map(function(url) {\n        return $.getJSON(url).then(anyComplete);\n    });\n    return deferred.promise();\n}\nraceToIt(["/echo/json/", "/echo/json/", "/echo/json/"]).then(function(data) {\n    console.log(data);\n});\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n