javascript - 无论如何要让这个嵌套回调更干净吗?

标签 javascript jquery

我正在寻找一种方法来使这组 AJAX 调用更清晰。我尝试过使用 $.when() ...但我无法真正让它工作。我认为这是由于没有传递延迟对象...因为我的 AJAX 调用位于模型对象内部。

这是我迄今为止所拥有的(一些代码被简单地排除):

var origin_form, destination_form; //assume string input from user
var destination, origin;

getOrigin();

//Gets origin data
function getOrigin(){

   //ASYNC CALL
   model.searchFeature(origin_form, 1, function(data){
     //additional callback code excluded
     origin = data; 
     getDestination();

   });
}

//Gets destination information
function getDestination(){

    //ASYNC CALL            
    model.searchFeature(destination_form, 1, function(data){
        //additional callback code excluded
        destination = data;     
        directions(origin, destination);
    });
}


 function directions(origin, destination){
    //Async call to request directions from google api
 }

任何建议都会很棒!

编辑:我正在寻找类似于 $.when() 的解决方案。基本上,我想在 getOrigin()getDestination() 完成后调用 directions() 而无需嵌套回调。

最佳答案

无需在共享作用域中使用变量,只需在函数之间传递值即可。

var origin_form, destination_form; //assume string input from user

getOrigin();

function getOrigin(){
   model.searchFeature(origin_form, 1, getDestination);
}

function getDestination(origin){           
    model.searchFeature(destination_form, 1, function(data) {
        directions(origin, data);
    });
}

function directions(origin, destination){
    //Async call to request directions from google api
}
<小时/>

或者使用Function.prototype.bind ,你可以再清理一下。

var origin_form, destination_form; //assume string input from user

getOrigin();

function getOrigin(){
   model.searchFeature(origin_form, 1, getDestination);
}

function getDestination(origin){  
    model.searchFeature(destination_form, 1, directions.bind(null, origin));
}

function directions(origin, destination){
    //Async call to request directions from google api
}

第一个参数传递给 .bind()null因为我不知道你是否想要 this directions() 的值要设置。如果这样做,则替换 null随心所欲this是。

关于javascript - 无论如何要让这个嵌套回调更干净吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402619/

相关文章:

javascript - jQuery 代码被忽略

javascript - Select2 使用 jquery 隐藏选项

javascript - Jquery 阻止设备键盘重新调整浏览器内容的大小

javascript - 正则表达式在 jquery 中只允许数字和单点

javascript - 如何根据 json 中值的数量动态附加 <td>

javascript - Node ,Express - 无法获取路线

javascript - 如何在点击事件上更新 HTML 元素?

javascript - $(li).width() 返回值包括填充?

jquery - sizcache 和 sizset 在 jQuery 中的作用是什么

javascript - 尝试对齐视频时的典型 IE 问题 - 请指教