Javascript 使用同一Ajax方法实例多次调用后返回承诺
我使用Ajax和JQuery从一个一次只返回100条记录的API中获取数据。如果我的查询给出的结果包含100多条记录,那么API将在响应中包含一个“offset”参数。我必须在一个新的API调用中使用这个offset参数来获取接下来的100条记录。如果要获取更多记录,API将包含一个新的偏移量参数。依此类推,直到获取所有记录 如您所见,我已经解决了这个问题,方法是让函数本身调用,直到不再包含“offset”参数。也就是说,直到没有更多的记录可获取为止 由于API的这种行为,我不能使用Ajax方法自己的.done函数,因为它会被执行多次(对于Ajax方法的每次迭代) 在完成所有Ajax调用后,如何调整下面的函数以返回承诺?Javascript 使用同一Ajax方法实例多次调用后返回承诺,javascript,ajax,promise,Javascript,Ajax,Promise,我使用Ajax和JQuery从一个一次只返回100条记录的API中获取数据。如果我的查询给出的结果包含100多条记录,那么API将在响应中包含一个“offset”参数。我必须在一个新的API调用中使用这个offset参数来获取接下来的100条记录。如果要获取更多记录,API将包含一个新的偏移量参数。依此类推,直到获取所有记录 如您所见,我已经解决了这个问题,方法是让函数本身调用,直到不再包含“offset”参数。也就是说,直到没有更多的记录可获取为止 由于API的这种行为,我不能使用Ajax方法
function getContracts(offset) {
var data = {};
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url,
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
contracts.push(this);
});
if (result.hasOwnProperty("offset")) {
getContracts(result.offset);
}
}
});
}
按要求提供真实完整的代码:
var objectContracts = [];
var landContracts = [];
var locations = [];
var customers = [];
var landOwners = [];
var frameworkAgreements = [];
function getObjectContracts(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Objektsavtal';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Objektsavtal",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
objectContracts.push(this);
});
if (result.hasOwnProperty("offset")) {
getObjectContracts(result.offset);
} else {
resolve();
}
}
});
});
}
function getLandContracts(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Markavtal';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Markavtal",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
landContracts.push(this);
});
if (result.hasOwnProperty("offset")) {
getLandContracts(result.offset);
} else {
resolve();
}
}
});
});
}
function getLocations(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Uppställningsplatser';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Uppställningsplatser",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
locations.push(this);
});
if (result.hasOwnProperty("offset")) {
getLocations(result.offset);
} else {
resolve();
}
}
});
});
}
function getCustomers(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Kunder';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Kunder",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
customers.push(this);
});
if (result.hasOwnProperty("offset")) {
getCustomers(result.offset);
} else {
resolve();
}
}
});
});
}
function getLandOwners(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Markägare';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Markägare",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
landOwners.push(this);
});
if (result.hasOwnProperty("offset")) {
getLandOwners(result.offset);
} else {
resolve();
}
}
});
});
}
function getFrameworkAgreements(offset) {
return new Promise((resolve, reject) => {
var data = {};
data["view"] = 'Alla Ramavtal';
if (offset !== undefined) {
data["offset"] = offset;
}
$.ajax({
url: url + "Ramavtal",
headers: {
Authorization: apiKey
},
data: data,
success: function(result){
$.each(result.records, function() {
frameworkAgreements.push(this);
});
if (result.hasOwnProperty("offset")) {
getFrameworkAgreements(result.offset);
} else {
resolve();
}
}
});
});
}
如果我完全理解了您的问题,那么如果您的Ajax请求的响应中没有
偏移量
,那么您希望解决一个承诺
我尚未测试此代码,但您可以执行以下操作:
function getContracts(offset) {
return new Promise((resolve, reject) => {
var data = {};
if (offset !== undefined) {
data['offset'] = offset;
}
$.ajax({
url: url,
headers: {
Authorization: apiKey,
},
data: data,
success: function(result) {
$.each(result.records, function() {
contracts.push(this);
});
if (result.hasOwnProperty('offset')) {
getContracts(result.offset);
} else {
// I guess this is what you want
// If there is no offset property => resolve the promise
resolve('Your result goes here');
}
},
});
});
}
请参阅else
块。您可以将最终的
结果
(任务完成后想要实现的任何结果)传递到解析
中。例如,您可以创建一个数组并将结果附加到该数组中,最后,您可以在resolve
中传递该数组
您可以使用.then()
或async/await
async () => {
const result = await getContracts(offset);
};
或
如果您看到一些未处理的承诺拒绝警告/错误,则始终可以将try/catch
块与async/wait和.catch
一起使用。然后
编辑:
- 首先,您没有在
中传递任何内容。在解析中传递的任何内容都将反映在resolve
中。然后(结果)
- 其次,您有全局变量,并将所有数据存储在其中。因此,现在不需要在解析内部传递它们,但这不是一个好方法,因为外部的任何函数或代码都可以修改它。我给你举个例子
const finalFunction = async () => {
const [result1, result2, result3] = await Promise.all([
getObjectContracts(offset1),
getLandContracts(offset2),
getLocations(offset3),
]);
console.log(result1, result2, result3);
};
finalFunction();
谢谢我应该用什么替换字符串“Your result goes here”?当您说“您可以使用.then()解决此问题”时,这是否意味着我可以执行getContracts().then()?我在resolve方法中找到了字符串的答案。“传递给doneCallbacks的可选参数”。我还注意到我可以使用getContracts().then()。我将把你的解决方案应用于几个函数。我怎么知道所有函数的承诺何时得到解决?这是promiseAll()吗?在这种情况下,是否应该将每个函数都转换为变量?像这样:var getContracts=function(){…}我已经更新了我的答案。如果您仍然不理解,请在此处发表评论。谢谢!请看我在上面评论中的问题,关于等待多功能的承诺。我怎么知道它们什么时候都完成了呢?如果你使用
.then()
,你不必担心任何事情,但过了一段时间,你就会陷入回调地狱。如果使用async/await,并且函数的输入/输出互不依赖,则会降低性能。你是对的,你必须使用Promise.all()来实现这一点。请参阅下面的链接,它已为您的问题提供了答案。避开这个!$.ajax
函数已经返回了一个承诺,您可以这样做。
function getObjectContracts(offset) {
return new Promise((resolve, reject) => {
var data = {};
const objectContracts = [];
data['view'] = 'Alla Objektsavtal';
if (offset !== undefined) {
data['offset'] = offset;
}
$.ajax({
url: url + 'Objektsavtal',
headers: {
Authorization: apiKey,
},
data: data,
success: function(result) {
$.each(result.records, function() {
objectContracts.push(this);
});
if (result.hasOwnProperty('offset')) {
getObjectContracts(result.offset);
} else {
resolve(objectContracts);
}
},
});
});
}
const finalFunction = async () => {
const [result1, result2, result3] = await Promise.all([
getObjectContracts(offset1),
getLandContracts(offset2),
getLocations(offset3),
]);
console.log(result1, result2, result3);
};
finalFunction();