【问题标题】:Zencoder progress JSON response converted to populate width in boostrap progress barZencoder 进度 JSON 响应转换为引导进度条中的填充宽度
【发布时间】:2013-07-22 20:45:25
【问题描述】:

我拼命寻找有关如何获取 zencoder 进度 JSON 响应、将响应中的“进度”变量转换为 javascript 变量并使用它来填充 css 宽度值中的数字的信息。

更多关于 Zencoder JSON 响应的信息可以在这里找到:https://app.zencoder.com/docs/api/jobs/progress

典型输出如下:

{
  "state": "processing",
  "progress": 32.34567345,
  "input": {
    "id": 1234,
    "state": "finished"
  },
  "outputs": [
    {
      "id": 4567,
      "state": "processing",
      "current_event": "Transcoding",
      "current_event_progress": 25.0323,
      "progress": 35.23532
    },
     {
      "id": 4568,
     "state": "processing",
      "current_event": "Uploading",
      "current_event_progress": 82.32,
      "progress": 95.3223
    }
  ]
}

我想每半秒左右获取一次更新的“进度”值,并用它来填充 Twitter Boostraps 进度条中的宽度值:

<div class="progress progress-striped active">
  <div class="bar" style="width: 40%;"></div>
</div>

任何帮助将不胜感激!

【问题讨论】:

  • 您可能会发现这很有用:bootply.com/67388 需要对其进行修改,以便您每隔一段时间请求/轮询结果,然后相应地更新进度条

标签: json twitter-bootstrap zencoder


【解决方案1】:

首先,您需要一个函数来实际执行轮询。收到回复后,您将更新进度条并执行您想做的任何其他事情。在这里,我将其拆分为一个单独的、未命名的函数parseResponse(),然后再次调用poll(),直到工作完成。

var jobId = 12345;

function poll() {
  setTimeout(function() {
    $.ajax({
      url: 'https://app.zencoder.com/api/v2/jobs/' + jobId + '/progress',
      type: 'GET',
      headers: { "Zencoder-Api-Key": 'ZENCODER READ ONLY API KEY' },
      //dataType: 'json',
      success: function(data) {
        parseResponse(data);
      },
      error: function(data) {
        console.log(data)
      }
    });
  }, 3000);
}

当我们从 Zencoder 获取进度时,我们只想在作业处于某些状态时更新进度条。这里我们只是注销状态,除非它正在处理或完成,在这种情况下,我们确实改变了进度条的宽度。

function parseResponse(data) {
  switch(data.state) {
    case 'pending':
      console.log('Pending');
      poll();
      break;
    case 'waiting':
      console.log('Waiting');
      poll();
      break;
    case 'processing':
      console.log('processing');
      $('.progress .bar').css('width', Math.round(data.progress) + '%');
      poll();
      break;
    case 'finished':
      console.log('Finished');
      $('.progress').removeClass('active');
      $('.progress .bar').css('width', '100%');
      break;
    case 'failed':
      console.log('Failed');
      break;
    case 'cancelled':
      console.log('Cancelled');
      break;
    default: 
      console.log("Wat?");
  }
}

设置完成后,您可以通过调用 poll() 来启动该过程。

这假设您使用的是 jQuery,并且页面上只有一个进度条,但这应该让您了解如何开始。

【讨论】:

  • 非常感谢您的回复。虽然代码看起来非常适合我的需要,但我无法让它工作。我在页面上只有一个进度条,但不确定如何确保 jQuery 安装在我的应用程序/服务器中。如果我太天真了,我深表歉意——我知道我的 PHP 方式,但很少使用 javascript。任何帮助将不胜感激!汤姆
  • 抱歉,我只是假设您包含 jQuery,因为 Bootstrap JS 都是 jQuery 插件。您应该会在页面顶部看到包含 &lt;script src="http://some-path/jquery.js"&gt; 如果它不存在,您可以使用 CDN version。我还编辑了我的答案,包括如何“启动”投票。
  • 只是为了让事情更容易,这里是working example。请记住,您需要同时指定 Zencoder 只读 API 密钥和作业 ID 才能执行任何操作。
  • 再次感谢您的回复。使用(非常有用的)工作示例,我仍然无法让它在这种环境中工作。我将代码修改为如下bootply.com/69306,它更新了一次'status' html,然后不再继续更新它,进度条也没有填满。刷新时,“状态”会相应更新,所以我只能假设这没有按要求循环?
  • 经过几个小时的反复试验,我设法解决了这个问题。问题是“Math.round(response.progress)”中的“响应”。这应该是“数据”。谢谢你让我走了 95% 的路。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2013-09-03
  • 2014-01-18
  • 2016-04-06
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多