如何让 JavaScript 回调等待另一个回调?
How to make a JavsScript callback wait for another callback?
我需要同时拨打两个 API 电话。并且其中一个回调必须在另一个之前执行。但是按顺序调用很慢而且对用户体验不利:
axios.get("/get_some_data").then(function(resp) {
do_some_operation();
axios.get("/get_other_data").then(function(resp) {
do_other_operation(); // Needs /get_some_data and /get_other_data both be done
});
});
});
在 C++ 中使用 std::conditional_variable 和以下伪(C++17 左右)代码可以轻松地进行并行调用并等待另一个调用
std::conditional_variable cv;
std::mutex mtx;
get_request("/get_some_data",[&](auto&& resp){
do_some_operation();
// Notify that the operation is complete. The other callback can proceed
cv.notify_all();
});
get_request("/get_other_data",[&](auto&& resp){
// Wait until someone notify the previous task is done
std::lock_guard lk(mtx);
cv.wait(lk);
do_other_operation();
});
我在各种网站上搜索过。但我不认为 JavaScript 带有 std::conditional_variable
甚至 std::mutex
之类的东西。我怎样才能发出并行请求,但让回调等待另一个?
听起来你想要这样的东西
const some = axios.get("/get_some_data").then(res => {
do_some_operation()
return res
})
const other = axios.get("/get_other_data")
Promise.all([some, other]).then(([ someRes, otherRes ]) => {
do_other_operation()
})
这将同时调用两个 URL。
当第一个解析时,它会调用 do_some_operation()
。此(大概)同步操作成为 some
承诺解决方案的一部分。 other
承诺在 HTTP 请求完成后解析。
一旦 some
和 other
承诺都得到解决,调用 do_other_operation()
Promise.all([
get_request("/get_some_data"),
get_request("/get_other_data")
]).then( function(responses) {
console.log(responses);
// do what you want
do_some_operation();
do_other_operation();
}).catch(function(error) {
console.error(error.message);
});
或
Promise.all([
get_request("/get_some_data").then(function (resp) {
do_some_operation();
return resp;
},
get_request("/get_other_data")
]).then( function(responses) {
console.log(responses);
// do what you want
do_other_operation();
}).catch(function(error) {
console.error(error.message);
});
我需要同时拨打两个 API 电话。并且其中一个回调必须在另一个之前执行。但是按顺序调用很慢而且对用户体验不利:
axios.get("/get_some_data").then(function(resp) {
do_some_operation();
axios.get("/get_other_data").then(function(resp) {
do_other_operation(); // Needs /get_some_data and /get_other_data both be done
});
});
});
在 C++ 中使用 std::conditional_variable 和以下伪(C++17 左右)代码可以轻松地进行并行调用并等待另一个调用
std::conditional_variable cv;
std::mutex mtx;
get_request("/get_some_data",[&](auto&& resp){
do_some_operation();
// Notify that the operation is complete. The other callback can proceed
cv.notify_all();
});
get_request("/get_other_data",[&](auto&& resp){
// Wait until someone notify the previous task is done
std::lock_guard lk(mtx);
cv.wait(lk);
do_other_operation();
});
我在各种网站上搜索过。但我不认为 JavaScript 带有 std::conditional_variable
甚至 std::mutex
之类的东西。我怎样才能发出并行请求,但让回调等待另一个?
听起来你想要这样的东西
const some = axios.get("/get_some_data").then(res => {
do_some_operation()
return res
})
const other = axios.get("/get_other_data")
Promise.all([some, other]).then(([ someRes, otherRes ]) => {
do_other_operation()
})
这将同时调用两个 URL。
当第一个解析时,它会调用 do_some_operation()
。此(大概)同步操作成为 some
承诺解决方案的一部分。 other
承诺在 HTTP 请求完成后解析。
一旦 some
和 other
承诺都得到解决,调用 do_other_operation()
Promise.all([
get_request("/get_some_data"),
get_request("/get_other_data")
]).then( function(responses) {
console.log(responses);
// do what you want
do_some_operation();
do_other_operation();
}).catch(function(error) {
console.error(error.message);
});
或
Promise.all([
get_request("/get_some_data").then(function (resp) {
do_some_operation();
return resp;
},
get_request("/get_other_data")
]).then( function(responses) {
console.log(responses);
// do what you want
do_other_operation();
}).catch(function(error) {
console.error(error.message);
});