猿问

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

我需要同时进行两个 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. 我怎样才能发出并行请求,但让回调等待另一个?


茅侃侃
浏览 91回答 2
2回答

莫回无

听起来你想要这样的东西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()

繁星coding

使用promise allPromise.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);});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答