使用 jQuery 和 Javascript 的多个 API 调用架构

ser*_*ays 5 javascript ajax jquery json

好奇其他人认为构建 API 调用的最佳方式是什么,该调用取决于 jQuery 中另一个 API 调用的响应。

脚步:

  1. 对端点进行 API JSONP 调用,接收响应
  2. 如果我们从第一次调用中得到 200 成功响应,我们将触发另一个 API 调用(这次是 JSON)。
  3. 将结果输出到浏览器。

这就是我将如何通过一些粗略的错误处理来构建它:

$(document).ready(function() {
  $.ajax({
     url: "http://example.com/json",
     type: 'POST',
     dataType: 'jsonp',
     timeout: 3000,
     success: function(data) {

       // Variables created from response
       var userLocation = data.loc;
       var userRegion = data.city;

       // Using variables for another call
       $.ajax({
         url: "http://example2.com/json?Location=" + userLocation + "&City=" + userRegion,
         type: 'POST',
         dataType: 'json',
         timeout: 3000,
         success: function(Response) {
          $(.target-div).html(Response.payload);
         },
         error: {
          alert("Your second API call blew it.");
         }
       });

     },
     error: function () {
       alert("Your first API call blew it.");
     }
  });
});
Run Code Online (Sandbox Code Playgroud)

JM *_*ang 6

在架构方面,可以考虑使用Promise模式将每一步解耦成一个函数,每个函数只关心自己的任务(不参考流程中的其他步骤)。当您需要重用这些步骤时,这提供了更大的灵活性。这些单独的步骤稍后可以链接在一起以形成一个完整的流程。

https://www.promisejs.org/patterns/

http://api.jquery.com/jquery.ajax/

http://api.jquery.com/category/deferred-object/

  function displayPayload(response) {
    $(".target-div").html(response.payload);
  }

  function jsonpCall() {
    return $.ajax({
      url: "http://example.com/json",
      type: 'GET',
      dataType: 'jsonp',
      timeout: 3000
    });
  }

  function jsonCall(data) {
    // Variables created from response
    var userLocation = data.loc;
    var userRegion = data.city;

    // Using variables for another call
    return $.ajax({
      url: "http://example2.com/json?Location=" + userLocation + "&City=" + userRegion,
      type: 'GET',
      dataType: 'json',
      timeout: 3000
    });
  }

  $(document).ready(function() {
    jsonpCall()
      .done(function(data) {
        jsonCall(data)
          .done(function(response) {
            displayPayload(response);
          }).fail(function() {
            alert("Your second API call blew it.");
          });
      }).fail(function() {
        alert("Your first API call blew it.");
      });
  });
Run Code Online (Sandbox Code Playgroud)