JavaScript多个回调函数

17

我一直在尝试理解JavaScript中的回调函数特性,但是一直没有成功。我的代码可能有问题,但是没有出现JavaScript错误,所以我认为语法应该是正确的。

基本上,我希望getDistanceWithLatLong()函数在updateDB()函数之前结束,然后确保在printList()函数开始之前结束。

我使用了一个硬编码的"setTimeout"调用来使其工作,但是这样做会过度补偿,并强制用户等待更长的时间,如果回调函数可以正常工作就没有必要这样做。

有什么建议吗?以下是代码:

function runSearchInOrder(callback) {
    getDistanceWithLatLong(function() {
        updateDB(function() {
            printList(callback);
        });
    });
}

1
忽略多个回调的问题,你想要实现什么? - Matthew
我需要以下3个函数按顺序运行并完成: getDistanceWithLatLong(); updateDB(); printList():仅仅这样列出来,我本以为会起作用,但有时候当我在console.log中打印东西时,printList()会在其他函数的循环完成之前运行。 - Rob
getDistance...updatedDB函数是否需要回调函数?如果需要的话,我不明白为什么它们不能正常工作。 - plalx
4个回答

27
为了完成这个任务,您需要将下一个回调函数传递到每个函数中。
function printList(callback) {
  // do your printList work
  console.log('printList is done');
  callback();
}

function updateDB(callback) {
  // do your updateDB work
  console.log('updateDB is done');
  callback()
}

function getDistanceWithLatLong(callback) {
  // do your getDistanceWithLatLong work
  console.log('getDistanceWithLatLong is done');
  callback();
}

function runSearchInOrder(callback) {
    getDistanceWithLatLong(function() {
        updateDB(function() {
            printList(callback);
        });
    });
}

runSearchInOrder(function(){console.log('finished')});

这段代码输出:

getDistanceWithLatLong is done
updateDB is done
printList is done
finished 

6
如何在回调函数之间传递变量? - RaduS

1

function1 = (callback1, callback2, callback3) => {
  setTimeout(() => {
    console.log("function 1 timed out!");
    callback1(callback2, callback3);
  }, 1500);
}

function2 = (callback1, callback2) => {
  setTimeout(() => {
    console.log("function 2 timed out!");
    callback1(callback2);
  }, 1500);
}

function3 = (callback1) => {
  setTimeout(() => {
    console.log("function 3 timed out!")
    callback1()
  }, 1500);
}

function4 = () => {
  setTimeout(() => {
    console.log("function 4 timed out!")
  }, 1500);
}

function1(function2, function3, function4);

只需从第一个函数传递回调并执行每个回调,然后传递其余的内容。

输出

function 1 timed out!
function 2 timed out!
function 3 timed out!
function 4 timed out!


1

wouldn't this work:

function callback(f1, f2) {
    f1();
    f2();
}

关于传递参数,要有创意。

0
在JavaScript中,一切都是对象,包括函数。这就是为什么你能够将回调函数作为参数传递 - 你像传递任何其他对象一样传递一个函数。
在每个函数声明中,你需要运行回调函数。
function runSearchInOrder(callback) {

    ...

    callback();
}

function getDistanceWithLatLong(callback) {

    ...

    callback();
}

function updateDB(callback) {

    ...

    callback();
}

那么你上面发布的代码应该可以工作。


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