【问题标题】:jQuery Promise - fire up done even if some json did not foundjQuery Promise - 即使没有找到一些 json 也会启动
【发布时间】:2018-06-27 18:15:41
【问题描述】:

我正在使用 Promise,但有时在一种情况下我无法从各种原因获取 JSON,即使缺少一些 JSON,我如何才能启动完成,目前这段代码我只有失败的消息

$.when(
    arrayResults[0] ? $.getJSON("url") : null,
    arrayResults[1] ? $.getJSON("url") : null,
    arrayResults[2] ? $.getJSON("url") : null

).done(function () { }).fail(function () {
    console.log('Failed');
});

【问题讨论】:

    标签: javascript jquery promise


    【解决方案1】:

    你可以使用deferred.always(cb):

    $.when(
        arrayResults[0] ? $.getJSON("url") : null,
        arrayResults[1] ? $.getJSON("url") : null,
        arrayResults[2] ? $.getJSON("url") : null
    )
    .done(function () { console.log('I will run when the promise was resolved') })
    .fail(function () { console.log('I will run when the promise was rejected') })
    .always(function() { console.log('I will always fire, regardless of previous results') })
    

    在此处查看更多信息:https://api.jquery.com/deferred.always/

    【讨论】:

      【解决方案2】:

      如果您使用的是 jQuery v3+,它符合 Promises A+,因此您可以将 catch() 添加到请求承诺中

      每当你从一个捕获中return时,它都会解析先前的承诺并将你返回的任何内容传递给承诺链中的下一个then()

      function getData(url){
        return $.getJSON(url)
           .then(data=>data)
           .catch(resolveFailure)
      
      }
      
      function resolveFailure(jqXhr) { 
        // return whatever you want here. I added the status in case that is of interest
        // could return `false` or string or whatever
        // can also log any issues back to server if needed
        return {
          error: true,
          status: jqXhr.status,
          statusText: jqXhr.statusText
        };
      }
      
      
      var req = getData('https://api.myjson.com/bins/l9ywp'),
          req2 = getData('https://httpbin.org/FAIL'),
          req3 = getData('https://api.myjson.com/bins/l9ywp');
      
      // could also replace `$.when with `Promise.all()`
      $.when(req, req2, req3).then(function(r1, r2, r3) {
        // validate the arguments based on whatever you return in the catch()
        console.log('r1', r1);
        console.log('r2', r2);// object returned from catch()
        console.log('r3', r3);
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

      【讨论】:

      • 我在函数中遇到问题,然后在 'data' 和 => 之间出现错误表达式,在 ' ) ' 之后需要换行或分号
      • 另外,使用此代码我仍然无法启动。表格只是没有加载。它总是失败:last req4 = getData(Url);
      • .then(data=>data) 更改为 .then(function(data){ return data})。首先是ES6语法
      • 对不起,如果我现在过度劳累了你,但我筋疲力尽,大脑几乎无法工作,现在你的例子看起来不错,但在这样做时我得到“Uncaught TypeError: $.getJSON(...).then (...).catch 不是函数”
      • 什么版本的jQuery?它可能不是 v3
      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多