JFo*_*kes 5 javascript jquery refactoring
我有以下代码:
$.when(loadProjects())
.then(function() {
$.when.apply($, buildRequests(projects))
.then(function(data) {
$.when.apply($, vcsRequests(buildTypes))
.then(function(data) {
$.when.apply($, vcsDetailRequests(vcsRoots))
.then(function(data) {
alert('done');
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
传递给when.apply()的每个函数都返回请求数组.我无法执行buildRequests调用,直到来自loadProjects()的调用完成,因为它们依赖于从这些调用返回的信息.每次呼叫都取决于前一次呼叫返回的信息,因此它们必须按此顺序排列.我需要知道所有调用何时完成,以便我可以处理返回的数据.
是否有更清洁的方法来解决这个问题?
前几天我遇到了yepnope.js 。我自己还没有尝试过,但如果您正在进行大量 ajax 加载,它可能会有所帮助。
实际上仔细思考这一点让我意识到 yepnope.js 并不真正适用于您的情况。在您的情况下,我会考虑让et al 通过在每个函数内部loadProjects()应用来返回一个承诺。when()另外pipe()使用可能会导致类似的情况
loadProjects().pipe(buildRequests).pipe(vcsRequests).pipe(vcsDetailRequests);
Run Code Online (Sandbox Code Playgroud)
样本buildRequests():
function buildRequests(projects){
// Do something using projects
// ...
var requestsPromise = ...; // Finally get ajax promise for requests
return requestPromise;
}
Run Code Online (Sandbox Code Playgroud)
requestPromise一旦解决/拒绝,结果将被传递到下一个管道函数。
从文档中pipe():
// Example: Chain tasks:
var request = $.ajax( url, { dataType: "json" } ),
chained = request.pipe(function( data ) {
return $.ajax( url2, { data: { user: data.userId } } );
});
chained.done(function( data ) {
// data retrieved from url2 as provided by the first request
});
Run Code Online (Sandbox Code Playgroud)