Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用同一Ajax方法实例多次调用后返回承诺_Javascript_Ajax_Promise - Fatal编程技术网

Javascript 使用同一Ajax方法实例多次调用后返回承诺

Javascript 使用同一Ajax方法实例多次调用后返回承诺,javascript,ajax,promise,Javascript,Ajax,Promise,我使用Ajax和JQuery从一个一次只返回100条记录的API中获取数据。如果我的查询给出的结果包含100多条记录,那么API将在响应中包含一个“offset”参数。我必须在一个新的API调用中使用这个offset参数来获取接下来的100条记录。如果要获取更多记录,API将包含一个新的偏移量参数。依此类推,直到获取所有记录 如您所见,我已经解决了这个问题,方法是让函数本身调用,直到不再包含“offset”参数。也就是说,直到没有更多的记录可获取为止 由于API的这种行为,我不能使用Ajax方法

我使用Ajax和JQuery从一个一次只返回100条记录的API中获取数据。如果我的查询给出的结果包含100多条记录,那么API将在响应中包含一个“offset”参数。我必须在一个新的API调用中使用这个offset参数来获取接下来的100条记录。如果要获取更多记录,API将包含一个新的偏移量参数。依此类推,直到获取所有记录

如您所见,我已经解决了这个问题,方法是让函数本身调用,直到不再包含“offset”参数。也就是说,直到没有更多的记录可获取为止

由于API的这种行为,我不能使用Ajax方法自己的.done函数,因为它会被执行多次(对于Ajax方法的每次迭代)

在完成所有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();