这是我第一次尝试使用异步JavaScript。我已经尝试过连接所有关于Promise的版本,但都无法成功编写,以使我的字符串返回(即$.Deferred、async/await、Promise、回调函数、依赖于.done)。虽然async:false作为ajax变量可以工作,但我试图避免采用我理解中的不良实践。我很想使用async/await,因为它非常简洁,但现在我愿意尝试任何有效的方法。我怀疑我正在以不正确的方式利用$.ajax返回。
非常感谢能够获得字符串wholename(随机生成的名字和姓氏)的有效返回,对于我自己学习的几个版本的示例,更加感激!
非常感谢能够获得字符串wholename(随机生成的名字和姓氏)的有效返回,对于我自己学习的几个版本的示例,更加感激!
function Actor(gender, name) {
if (gender == "" || gender == undefined) {this.gender = "female";} else this.gender = gender;
if (name == "" || name == undefined) {this.name = makeName(this.gender);} else this.name = name;
}
function getPromiseName(sex) {
return promise = $.ajax({
type: "GET",
url: "TMxml.xml",
dataType: "xml"//,
//async: false //this works for returns, but is apparently bad practice
});
}
function makeName(sex) {
var fnames = [];
var lnames = [];
var thexml = getPromiseName(sex);
thexml.done(function(xml) {
if (sex == "male") {
$(xml).find('malename').children().each(function(){
fnames.push($(this).text());
});
}
if (sex == "female") {
$(xml).find('femalename').children().each(function(){
fnames.push($(this).text());
});
}
$(xml).find('lastname').children().each(function(){
lnames.push($(this).text());
});
wholename = fnames[Math.floor(Math.random() * fnames.length)] + " " + lnames[Math.floor(Math.random() * lnames.length)];
alert("wholename = " + wholename); //successfully alerts a randomized name
return wholename; //but returns undefined, or [object Promise] when using async/await
});
}
var thexml = await getPromiseName(sex);
在这一点上,我认为thexml不会是一个Promise...然而,由于您正在使用jQuery的糟糕的Promise替代方案,您的结果可能会有所不同。 - Jaromanda X