为了账号安全,请及时绑定邮箱和手机立即绑定

如何让 JavsScript 回调等待另一个回调?

如何让 JavsScript 回调等待另一个回调?

茅侃侃 2023-06-09 17:29:40
我需要同时进行两个 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. 我怎样才能发出并行请求,但让回调等待另一个?
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

听起来你想要这样的东西


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和otherpromises 都解决了,调用do_other_operation()


查看完整回答
反对 回复 2023-06-09
?
繁星coding

TA贡献1797条经验 获得超4个赞

使用promise all

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);

});


查看完整回答
反对 回复 2023-06-09
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信