从另一个函数

时间:2016-05-06 22:43:58

标签: javascript jquery

我正在设置与机器人的自动对话动画。

当打印出第一条消息("你好,看看这个!")时,我想转到下一个函数.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

1 个答案:

答案 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 } 创建和返回的同一对象。