【发布时间】:2013-09-03 09:14:05
【问题描述】:
已经在 JS 中有一个层,它通过以下实现帮助获取和发布到服务器:
var getJson = function(url, callback, onError) {
$.get(url)
.done(function(data) {
if(callback != null)
callback(data);
})
.fail (function(error) {
if(onError != null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
var postJSON = function(url, data, callback, onError) {
$.ajax({
url : url ,
type: "POST" ,
contentType : "application/json"
dataType : "json" ,
date : ko.toJSON(data)
})
.done(function(data) {
if(callback ! = null)
callback(data);
})
.fail(function(error) {
if(onError ! = null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
在 DataService 层使用这些实现:
// Get
var find = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */ + "?queryString = " + data.filter;
getJson(url , onSuccess , onError);
};
// Post
var save = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */;
postJSON(url, data, onSuccess, onError);
};
但是我们使用 webapi,在某些情况下,一个请求取决于另一个请求的结果,生成一个“末日金字塔”。 为了使代码更优雅,我们正在实现用于异步编程的库 Q。
为了遵循上面显示的模式,使用 Q Promises 实现了新的 get 方法,如下所示:
var getJsonDefer = function(url, callback, onError) {
return Q.when($.getJSON(url))
.then (function(data) {
if(callback ! = null)
callback(data);
})
.fail (function(error) {
if(onError ! = null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
我正在尝试以这种方式在 DataService 层上使用此实现:
// Get
var find = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */ + "?queryString = " + data.filter;
return getJsonDefer(url, onSuccess, onError);
};
无论如何,在我的层 viewmodel javascript 中,假设我需要使用 3 个查找,其中一个取决于另一个的结果:
var = dataOne {
filter: " Filter"
};
findOne(dataOne,
function(result) {
return result;
}
function(error) {
throw error;
})
.then(function(args) {
var = datatwo {
filter: args
};
// Second
findTwo(datatwo ,
function(result) {
return result;
}
function(error) {
throw error;
}
);
})
.then(function(args) {
var = dataThree {
filter: args
};
// Third
findThree(dataThree,
function(result) {
return result;
}
function(error) {
throw error;
}
);
}).catch(function(error) {
// Handle any error from all above steps
})
.done();
我的问题:
我承认我无法以正确的方式实现,因为我在 .then() 中的所有函数都带有未定义的参数。
我想知道满足此处提出的方案的最佳做法是什么。
【问题讨论】:
标签: javascript asynchronous asp.net-web-api deferred q