2014-08-27 131 views
0

我希望在继续下一个函数/代码行之前为变量分配一个来自异步函数回调的值。等待异步函数在继续之前完成

在我的jsfiddle中,标题变量是我想要获取Soundcloud track API请求的值。希望你明白我的意思,否则我会回来进一步解释。

jsfiddle

最近我开始理解异步函数是如何工作的,让我明白了为什么我的代码,并没有真正的工作。我正在寻找的是一种让变量playerData等待运行直到标题被分配的方法。

如果这是不可能的,我会很感激其他技巧,如何让这个工作,因为我想。

谢谢!

Ps。在我的真实网页中,每个“玩家”div都会包含具有不同艺术家的玩家。

从我的jsfiddle

相关的JavaScript在注释行是我将不得不把它,如果它不是为异步问题:

$(document).ready(function() { 
var source = document.getElementById('player-template').innerHTML; 
var playerTemplate = Handlebars.compile(source); 

SC.initialize({ 
    client_id: '90fb9e15c1e26f39b63f57015ab8da0d' 
}); 


var title1; 
var title2; 

    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player1')); 
     //title1 = tracks[0].title; 
    }); 
    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player2')); 
     //title2 = tracks[0].title; 
    }); 
    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player3')); 
    }); 
    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player4')); 
    }); 
    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player5')); 
    }); 
    SC.get("https://stackoverflow.com/users/theshins/tracks", function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player6')); 
    }); 


//Data that will replace the handlebars expressions in our template 
var playerData = { 
    title1 : title1, 
    title2 : title2, 
}; 

$('#player-placeholder').html(playerTemplate(playerData)); 

}); 
+0

所以你不要不希望这些任务是异步的? – BlaShadow 2014-08-27 18:27:08

+0

这甚至可能吗?正如我在第一篇文章中所说的,我认为更有可能实现的是等待playerData赋值运行,直到标题变量被赋值(等到它们!= null,也许?)。 – user3880485 2014-08-27 18:30:17

+0

这可能是一个解决方案,可以为你工作。 – BlaShadow 2014-08-27 18:32:25

回答

2

使用jQuery一些承诺框架,只有你自己链中的每个请求的承诺与$.when功能,像这样:

var a = $.get("/a"); 
var b = $.get("/b"); 
var c = $.get("/c"); 

$.when(a, b, c).then(function() { 
    // render template here 
}); 

我怀疑的SoundCloud API返回jQuery的承诺,但我想你可以包装SC.get函数返回jQuery的承诺:

function wrapGet(url) { 
    var deferred = $.Deferred(); 
    SC.get(url, function(result) { 
     deferred.resolve(result); 
    }); 
    return deferred.promise(); 
} 

现在你可以这样调用:

var a = wrapGet("https://stackoverflow.com/users/theshins/tracks").then(function(tracks){ 
    SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player1')); 
     //title1 = tracks[0].title; 
    }); 

var b = ... 


$.when(a, b, ...).then(function() { 
    // render template here 
}); 
+0

我之前把playerData变量放在函数里面有问题,但我一定会试试这个! – user3880485 2014-08-27 18:38:55

+0

尝试像这样应用它[jsfiddle](http://jsfiddle.net/ffj7x0be/17/)。不知道到底出错了什么(可以通过jsfiddle进行调试/故障排除?)。这很可能只是我误解和错误应用。 – user3880485 2014-08-27 18:52:57

+0

这只是一个概念,我没有尝试过。是的,可能是必要的。 – Constantinius 2014-08-27 18:54:34

相关问题