您需要在所有函数都可以访问它的范围内声明该变量。由于您的getGroupMembers
函数位于全局范围内,因此您的users
变量必须如此。将其移动到ready
orclick
范围内,您可以将变量声明为本地变量。
但是,将请求的结果作为参数传递给resolve
:
$(document).ready(function() {
$('#message_send').click(function() {
var deferred = getGroupMembers({
page: 1,
per_page: 100
});
deferred.then(function(users) {
console.log(users);
});
});
});
function getGroupMembers(querydata) {
var users = [];
var deferredObject = new $.Deferred();
…
// some asynchronous tasks, callbacking either
deferredObject.resolve(users);
// or
deferredObject.reject();
…
return deferredObject.promise();
}
对于一些语法糖,您不妨只使用 Ajax Deferred 的pipe
方法。
递归管道方法:
function getGroupMembers(querydata) {
return $.ajax({
url: "/echo/json/",
dataType: "json",
data: querydata,
cache: false
}).pipe(function(data) {
var user = data.response.UserActions,
users = [];
for (var u = 0; u < user.length; u++) {
users.push(user[u].user.id);
}
if (querydata.page < data.meta.total_pages) {
querydata.page++;
return getGroupMembers(querydata).pipe(function(nextusers) {
return users.concat(nextusers);
});
} else {
return users;
}
});
}