从另一个函数延迟解析的返回

Return resolved deferred from another function

本文关键字:返回 延迟 另一个 函数      更新时间:2023-09-26

我正在用机器人制作一个自动对话的动画。

打印完第一条消息("嗨,看看这个!")后,我想转到下一个功能.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

首先,定义变量,在每个变量所需的范围中使用var

问题是如何处理r变量。您正在创建deferred并将其存储在r上,返回r,然后,在函数结束400ms后,创建一个新的r(因为以前的r没有用var定义,所以这个是超时处理程序函数中的另一个变量),printLetters的输出是另一个deferred。。。最后一个CCD_ 14与CCD_。

我建议您将r(或其他更具描述性的名称)定义为全局(在任何函数之外),只创建一次延迟对象,然后始终使用此变量。

更新

由于有几个函数需要返回一个deferred,因此可以将deferred作为参数传递。重点是与变量保持一致。例如(未测试,接受建议并自己尝试):

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
}

无需返回任何内容或创建第二个延迟对象,您使用的是printMessage创建和返回的同一对象。