递归函数JS中级联的多个异步调用
Multiple asynchronous call in cascade in recursive function JS
我已经知道这个问题已经被问过很多次了,但我不知道如何组织我的代码。我来自 C/C++ 语言,但仍然有思维方式,我用 JS 编写的内容看起来 'meaningless'.
我正在使用递归函数在地图上生成旅行。问题是我需要对 2 个不同的 API 进行 2 个异步调用,第二个取决于第一个的结果。
其实我一直在使用回调函数,像这样:
function asyncFunction(param, callbackF) {
// ... //
$.get(url, function(data, status) {
callbackF(data, status);
})
}
function asyncFunction2(param, callbackF) {
// ... //
$.get(url2, function(data, status) {
callbackF(data, status);
})
}
function recursiveFunction(param1, param2, num, tab, distance) {
//.. stuff with parameters //
asynFunction(param1, function(result, status) {
// .. stuff with parameters .. //
//.. Algo stops when distance is 0 ..//
if(!distance) {
asyncFunction2(param, function(data, status) {
// Final stuff //
return; // End
});
}
else recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
});
}
recursiveFunction(param1, param2, num, tab, distance);
它可以正常工作,但有很多错综复杂的问题,我什至不知道这个功能是否出错(例如,对 API 的调用失败等)。
问题是如何在此上下文中引入 Promises 或在 JS 中引入 async/await 术语?
我怎样才能把这段代码变成更容易理解的方式?
谢谢。
$.get
已经 return 是一个类似 Promise 的对象。您只需要摆脱回调和 return 承诺。
function asyncFunction(param) {
// ... //
return $.get(url)
}
function asyncFunction2(param) {
// ... //
return $.get(url2)
}
现在您可以将 async/await
用于您的函数。这样的东西应该可以工作
async function recursiveFunction(param1, param2, num, tab, distance) {
const result = await asyncFunction(param1);
// .. stuff with parameters .. //
if(distance) {
await recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
} else {
await asyncFunction2(param)
}
}
recursiveFunction(param1, param2, num, tab, distance);
我已经知道这个问题已经被问过很多次了,但我不知道如何组织我的代码。我来自 C/C++ 语言,但仍然有思维方式,我用 JS 编写的内容看起来 'meaningless'.
我正在使用递归函数在地图上生成旅行。问题是我需要对 2 个不同的 API 进行 2 个异步调用,第二个取决于第一个的结果。
其实我一直在使用回调函数,像这样:
function asyncFunction(param, callbackF) {
// ... //
$.get(url, function(data, status) {
callbackF(data, status);
})
}
function asyncFunction2(param, callbackF) {
// ... //
$.get(url2, function(data, status) {
callbackF(data, status);
})
}
function recursiveFunction(param1, param2, num, tab, distance) {
//.. stuff with parameters //
asynFunction(param1, function(result, status) {
// .. stuff with parameters .. //
//.. Algo stops when distance is 0 ..//
if(!distance) {
asyncFunction2(param, function(data, status) {
// Final stuff //
return; // End
});
}
else recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
});
}
recursiveFunction(param1, param2, num, tab, distance);
它可以正常工作,但有很多错综复杂的问题,我什至不知道这个功能是否出错(例如,对 API 的调用失败等)。
问题是如何在此上下文中引入 Promises 或在 JS 中引入 async/await 术语? 我怎样才能把这段代码变成更容易理解的方式?
谢谢。
$.get
已经 return 是一个类似 Promise 的对象。您只需要摆脱回调和 return 承诺。
function asyncFunction(param) {
// ... //
return $.get(url)
}
function asyncFunction2(param) {
// ... //
return $.get(url2)
}
现在您可以将 async/await
用于您的函数。这样的东西应该可以工作
async function recursiveFunction(param1, param2, num, tab, distance) {
const result = await asyncFunction(param1);
// .. stuff with parameters .. //
if(distance) {
await recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
} else {
await asyncFunction2(param)
}
}
recursiveFunction(param1, param2, num, tab, distance);