【问题标题】:jQuery promise (variable number of promises)jQuery 承诺(可变数量的承诺)
【发布时间】:2016-10-14 20:49:33
【问题描述】:

我有一个脚本可以加载多个 SVG 文件,然后应该绘制它们。 https://plnkr.co/edit/offqAzlaR1xqGrROQBTc

  var s = Snap("#svg");
  var bigCircle = s.circle(150, 150, 100);

  // Helper to convert Snap.load() into a Promise.
  function loadSVG(url) {
    var deferred = new $.Deferred();
    Snap.load(url, function(x) {
      deferred.resolve( x );
    });
    return deferred.promise();
  }

  // Make an array of Promises.
  var loadPromises = [
    loadSVG('eu.svg'),
    loadSVG('af.svg'),
    loadSVG('am.svg'),
    loadSVG('as.svg'),
  ];

  // Wait for all the Promises to finish.
  $.when( loadPromises ).done(function ( results ) {
    console.log(results); //<-- seems to be a promise again!!!!
    for (var i = 0; i < results.length; ++i) {
      var svg = results[i];
      // Your processing of each SVG goes here.
      var g = svg.select("g");
      s.append(g);
    }    
  });

我没有收到任何错误,但奇怪的是,我的 done() 结果似乎又是一个承诺(至少在控制台中看起来像这样)。 done() 的结果应该是一个 SnapJs 对象的数组。我做错了什么?

【问题讨论】:

  • 如果您将Promise Polyfill 用于向后浏览器(IE 系列),那么$.when( loadPromises ).done(function ( results ) { 将变为Promise.all( loadPromises ).then(function ( results ) {

标签: javascript jquery asynchronous promise


【解决方案1】:

您必须使用apply 将一组参数传递给$.when

$.when.apply($, loadPromises).done(function () {
    var results = [].slice.call(arguments);

    ....
});

这等于

$.when(loadPromises[0], loadPromises[1], loadPromises[2], etc)

【讨论】:

  • 完美。非常感谢!我自己不会发现这一点。
  • “结果”有类似的东西吗?因为我只在“结果”中得到第一个结果,而不是数组
  • 确实如此,给我一秒钟试试
  • 以下是通常以数组形式获取结果的方式 -> jsfiddle.net/adeneo/tjawru58
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2016-09-18
  • 1970-01-01
  • 2018-06-23
  • 2017-12-21
  • 2012-07-17
  • 2019-07-08
相关资源
最近更新 更多