【问题标题】:JavaScript initializing callback parameters down the callback chainJavaScript 在回调链中初始化回调参数
【发布时间】:2015-10-02 12:14:40
【问题描述】:

注意:我正在引导一个 reactjs 应用,但这是一个通用的 JavaScript 问题。

我有一个特殊的模块“locationUtils”,我试图将它保存在它自己的包中,但是将该代码分开会导致回调令人眼花缭乱。

当我访问其中一个方法时,我必须用它发送一个回调只有一个初始定义的参数,然后在该方法中我得到另一个数据参数来初始化另一个参数.

我以后可以像在 JavaScript 中那样添加未定义的参数吗,一般来说,在回调链中为回调方法初始化参数是一种好习惯 ,还是我犯了一个令人费解的新手错误?

/********************Module 1******************************/
var bootStrapUI = function(callback) {
  locationUtils.findData(findOtherData(callback));
}

//This gets called last to finalize bootstraping
var findOtherData = function(callback,originalFetchedData){
 //use originalFetchedData to get more data
 //bootStraping program with all rendering data
 callback() //sends back a boolean confirming all fetched
}

/**********************Module2**********************************/

var findData = function(findOtherData){
  var data = magicGetData();
  findOtherData(findOtherData,data);//I initialized a param late here!
}

【问题讨论】:

    标签: javascript callback reactjs bootstrapping


    【解决方案1】:

    这是一个很好的 Javascript 问题,对于外行来说,回调可能会成为一个严重的地狱,尤其是当它们是嵌套的和/或它们返回的顺序很重要时。

    这就是 Promise 的用武之地:它们是 Javascript 开发的重要工具,并且即将成为标准的一部分(在 EcmaScript 6 中)。

    本质上:promise 是从函数返回的对象,该对象具有在异步操作(例如 API 调用)完成时调用的方法(回调)。 Promise 和回调之间的区别在于,Promise 允许您构建处理回调的方式,重要的是,以什么顺序。

    我最近编写了一个方法,该方法必须进行 30 次 api 调用,每次调用都取决于前一次调用的结果(这不是一个设计良好的 api)。你能想象用回调来做到这一点吗?事实上,我创建了一个 promise 数组,并使用 jQuery.when() 来处理所有 api 调用完成后的事情。

    目前我们需要使用一个库来保存 Promise。 jQuery:https://api.jquery.com/jquery.deferred/ 是显而易见的,但还有许多其他实现可以做同样的事情。

    更新:

    这个问题更具体地涉及在回调之间传递参数以及在它们之间移动时修改参数。这可以通过将您需要的任何信息作为参数传递给您的 resolve 方法来轻松完成。

    通常看起来像这样(使用 jQuery):

    var myAsyncMethod = function(info){
    
        var deferred = $.Deferred();
    
        $.getJSON(myUrl, 
            function(dataFromServer) {
    
                // Do stuff with data
                var newData = doSomething(dataFromServer);
                deferred.resolve(newData);
    
            });
    
        });
    
        return deferred.promise(); 
    
    };
    
    // Make initial method call
    myAsyncMethod(myInitialData).then(
        function(transformedData){       
            // transformed data from server is returned here.
        }
    );
    

    【讨论】:

    • 但是主要的问题是关于沿着链的轨迹拾取新的属性(承诺也是链)。当我进行连锁时,我可以选择属性以进一步使用连锁吗?
    • 是的。 deferred.resolve() 方法接受一个参数,该参数将传递给解析方法(在大多数情况下是 .then())。所以你去 deferred.resolve(myObj) 其中 myObj 是一个对象,你的 args 可以在它在链上传递时设置/获取。希望这是有道理的!
    • 甜蜜!谢谢!如果您可以快速将其添加到您的答案中,我可以将其标记为已回答,以供下一个阅读此页面的人使用;)
    猜你喜欢
    • 2014-12-22
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多