等待异步函数完成后再继续
Wait for asynchronous function to finish before proceeding
我希望在变量继续执行下一个函数/代码行之前,为其分配一个来自异步函数回调的值。
在我的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("/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("/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("/users/theshins/tracks", function(tracks){
SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player3'));
});
SC.get("/users/theshins/tracks", function(tracks){
SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player4'));
});
SC.get("/users/theshins/tracks", function(tracks){
SC.oEmbed(tracks[0].permalink_url + "/&maxheight=100&maxwidth=300&format=json&sharing=false", document.getElementById('player5'));
});
SC.get("/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));
});
单独使用jQuery,您可以将每个请求的promise与$.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 promise,但我想您可以包装SC.get
函数来返回jQuery promises:
function wrapGet(url) {
var deferred = $.Deferred();
SC.get(url, function(result) {
deferred.resolve(result);
});
return deferred.promise();
}
现在你可以这样称呼它:
var a = wrapGet("/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
});
如果你想等到这些任务被执行,我建议你使用这样的promise框架https://github.com/kriskowal/q
相关文章:
- 等待函数执行后再继续
- 如何让foreach循环等待$http.get完成后再继续
- 如何在Node.js中等待函数完成后再继续
- 等待AJAX响应后再继续
- 等待 AJAX,然后再继续执行单独的函数
- 使用生成器等待输入,然后再继续 forEach 循环的主体
- 如何使用 JQuery 添加延迟?(让它等待 5 秒再继续)
- 等待多个 ipc 调用完成,然后再继续电子/冗余
- 如何等待findOneAndUpdate完成,然后再继续async.series
- 等待 API 调用在 Javascript 中完成,然后再继续
- Angular2 可观察 - 等待多个函数调用,然后再继续
- 等待方法的响应,然后再继续而不使用 SJAX
- 等待 .each 完成,然后再继续 (jQuery)
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 在JavaScript或Jquery中,让循环等待按钮按下后再继续
- Javascript/jQuery使函数等待回调后再继续
- 等待图像加载后再继续
- 如果我屈服于承诺,它会等待承诺得到解决后再继续吗
- 等待异步函数完成后再继续
- 等待异步任务完成后再继续