Snap.svg - 如何同步加载 SVG?

nik*_*kop 2 javascript svg snap.svg

知道这Snap.load();是异步的,我正在寻找一种按请求的顺序附加加载的文件的方法。这是我正在使用的代码:

s = Snap(800, 800);

function loadSvg(url) {
    Snap.load(url, appendSvg);
};

function appendSvg(svg) {
    g = svg.select("g");
    s.append(g);
};

loadSvg('https://s3-us-west-2.amazonaws.com/s.cdpn.io/9473/b.svg');
loadSvg('https://s3-us-west-2.amazonaws.com/s.cdpn.io/9473/a.svg');
Run Code Online (Sandbox Code Playgroud)

我发现了这个(http://svg.dabbles.info/snaptut-loadmulti.html),但我想知道是否有更简单的官方Snap.svg方法可以做到这一点?对我来说,感觉Snap.load();应该有一个包含此功能的功能?

rha*_*oto 6

您可以使用Javascript Promise很好地对异步任务进行排序(对于还没有本机 Promise 的平台,可以使用polyfill ),例如:

// Helper to convert Snap.load() into a Promise.
function loadSVG(url) {
  return new Promise(function(resolve, reject) {
    Snap.load(url, resolve);
  });
};

// Make an array of Promises.
var loadPromises = [
  loadSVG('http://example.com/a.svg'),
  loadSVG('http://example.com/b.svg'),
  loadSVG('http://example.com/c.svg'),
  ...
];

// Wait for all the Promises to finish.
Promise.all(loadPromises).then(function(results) {
  // results contains the loaded SVGs, in order.
  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);
  }
});
Run Code Online (Sandbox Code Playgroud)