Jquery - 使用延迟对象和承诺链式调用函数,但不需要使用setTimeout

3
我需要依次执行2个函数,确保"A"函数中的所有内容都执行完后再执行"B"函数的内容。我找不到不使用setTimeout的示例,这很奇怪。下面是一个示例(来自这里),它是否有效?我该如何测试它是否有效?我可以使用哪些虚拟代码来模拟“//使用SharePoint JSOM进行操作”需要花费5秒到30秒的时间。请注意不要删除HTML标记。
var a = function() {
var defer = $.Deferred();

//do stuff with SharePoint JSOM

console.log('a() called');

return defer;
};

var b = function() {
var defer = $.Deferred();

console.log('b() called');


return defer;
};



a().then(b);

是的,只需使用 setTimeout 作为占位符即可。 - Bergi
如果 b 不执行任何异步操作,它不应该返回一个延迟对象(或者 Promise)。then 也可以使用同步回调函数。 - Bergi
根据我的测试和阅读,你不能使用 setTimeout 作为虚拟程序,因为它根本不会停止调用代码。而且我也不能使用预设的延迟。 - Zertix.net
是的,deferreds或JSOM也不会阻止调用代码,这就是它们的全部意义。 - Bergi
您好,我的意思不是完全停止代码。只是暂停函数B的执行,直到函数A执行完毕(而不使用setTimeout)。您是说这不是Jquery deferred/promises的预期目的吗? - Zertix.net
b 没有停止 - 它还没有执行。它被延迟了,计划在 a 完成后执行。这就是延迟对象的作用。因此,只需使用 setTimeout 异步解决 a 返回的 promise 即可。 - Bergi
1个回答

4

只需使用promise(原生JS)并使用then连接它们即可简单使用。

function a() {
    return new Promise(function(resolve) {
        console.log("wait two seconds ...");

        // this timeout is only here for demo purpose ;)
        setTimeout(function() {
            console.log("A");
            resolve();
        }, 2000);
    });
}

function b() {
    console.log("B");
}

a().then(b);

如果你想使用jQuery deffered,它几乎是相同的。

function a() {
    var defer = $.Deferred();
    
    console.log("wait two seconds ...");

    // this timeout is only here for demo purpose ;)
    setTimeout(function() {
        console.log("A");
        defer.resolve();
    }, 2000);
    
    return defer;
}

function b() {
    console.log("B");
}

a().then(b);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


嗨,我知道这种方法,但只是想要一个使用jQuery promises的工作示例... - Zertix.net
但是 setTimeout 不是固定的 2000 毫秒吗?我不想要一个固定的超时时间。我希望当 A 自然结束时 B 执行。 - Zertix.net
1
setTimeout 只是一个例子,你可以完全删除它。 ;) 在这里查看:https://jsfiddle.net/cxcrk8vr/ @Zertix.net - eisbehr
正确。调用defer.resolve();表示“好的,我完成了,请继续下一个”。 ;) 例如,在ajax回调中可以调用defer.resolve();。所以在ajax请求完成之前,b()的执行会等待。@Zertix.net - eisbehr
1
@Zertix.net 不,因为您仍然希望在执行任何操作完成后才执行 .resolve(),这将需要某种回调(就像 setTimeout 一样)。promises 不能避免回调的需求。 - Kevin B
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接