我正在设置与机器人的自动对话动画。
当打印出第一条消息("你好,看看这个!")时,我想转到下一个函数.then()
。但是,在这种情况下,我不知道如何设置r.resolve()
,它就像嵌套或其他东西。
var messages = [
"Hi there, take a look at this!",
"Enter your address",
"blah blah"
];
function printLetters(target, message, index, interval, n) {
r = $.Deferred();
$('#m'+n).fadeIn();
if (index < message.length) {
$(target).append(message[index++]);
setTimeout(function () {
printLetters(target, message, index, interval, n);
}, interval);
} else {
r.resolve();
}
elem.scrollTop = elem.scrollHeight;
return r;
}
function printMessage(n) {
r = $.Deferred();
setTimeout(function(){
$('#m'+n+'>p').empty();
r = printLetters('#m'+n+'>p', messages[n-1], 0, 40, n);
}, 400);
return r;
}
function startConversation() {
printMessage(1)
.then(showThumb1AndTapButton)
.then(showThumb2AndScroll)
.then(choosePaymentMethod)
.then(enterAddress);
}
startConversation();
在这种情况下,我想从printMessage(1)
转到下一个.then()
函数,但我不确定如何。
如果邮件已完成从其他功能打印,我不确定如何返回已解决的r
?
答案 0 :(得分:0)
首先,定义变量,在每个变量的所需范围内使用var
。
问题在于您如何处理r
变量。您正在创建延迟并将其存储在r
上,返回r
,然后在功能结束后400毫秒,创建新的r
(因为之前的r
尚未使用var
定义,这个是超时处理函数中的其他变量),其输出为printLetters
,这是其他延迟的......最后{{1与r
返回的值无关。
我建议你将printMessage
(或其他更具描述性的名称)定义为全局(在任何函数之外),只创建一次延迟对象,然后始终使用此变量。
<强>更新强>
由于您有几个需要返回延迟的函数,因此您可以将延迟作为参数传递。关键是要与变量保持一致。例如(未经测试,请参考建议并亲自尝试):
r
然后
function printMessage(n) {
var r = $.Deferred();
setTimeout(function(){
$('#m'+n+'>p').empty();
printLetters(r, '#m'+n+'>p', messages[n-1], 0, 40, n); <--var needed for this r to be defined inside here
}, 400);
return r;
}
无需返回任何内容或创建第二个延迟,您正在使用function printLetters(r, target, message, index, interval, n) {
...
...
r.resolve(); <--Note this is the parameter r
}
创建和返回的同一对象。