添加onTimeout回调

时间:2016-04-18 19:34:30

标签: javascript ajax

这更像是一个我想和你谈谈的设计问题。

我们有一个Javascript SDK,客户端可以将我们的API与(想想stripe.js)连接起来。我们希望添加功能,以便在发生超时时通知客户端(例如,某些事情发生在链中并且请求需要超过30秒)。

我们可以选择几种方式:

  • 添加另一个参数,该参数接收将在XMLHTTPRequest超时时调用的函数:
    App.tokenize({
      // params to send
    }, function (response) {
      // SUCCESS OR FAIL RESPONSE
    }, function() {
      // CALLED WHEN REQUEST TAKES OVER 30 SECONDS
    });       
  • 合并对单个回调的响应:
    App.tokenize({
      // params to send
    }, function (response) {
      // SUCCESS, FAIL, OR TIMEOUT RESPONSE
    });       

我们认为单个回调应该是带有状态代码的往返HTTP请求。如果请求在客户端超时,我们将不会收到HTTP 408 TIMED OUT响应。

当您与这样的Javascript SDK接口时有什么意义?您是否找到了处理客户端超时的SDK的任何示例?对此的任何见解都会很棒。

谢谢!

1 个答案:

答案 0 :(得分:1)

我会选择promises。 Promisses可以polyfilled for older browserssupported by the modern ones。如果您使用的是angularjQuery,则可以使用其内置的承诺功能。

您的代码可能如下所示:

function getToken() {
  return new Promise(function(resolve, reject) {
     var timeout = setTimeout(function() {
       reject('TIMED OUT');
     }, 3000);
     yourAjaxCall(function ajaxCompleted(result) {
       clearTimeout(timeout);
       resolve(result);
     });
  });
}

对于您的客户来说,以他们已经习惯的方式使用您的api会非常方便:

  getToken()
    .then(function(token) {
      console.log('got the token', token); 
    })
    .catch(function(err) {
      console.log('something went wrong:', err);
    });

使用新的ES7 await功能(需要es7转换器,如打字稿或babel),他们可以在没有任何回调的情况下使用您的API。

async function logThatToken() {
  await token = getToken();
  console.log(token);
}