gpt4 book ai didi

JavaScript 初始化回调链中的回调参数

转载 作者:行者123 更新时间:2023-12-03 08:45:30 25 4
gpt4 key购买 nike

注意:我正在引导一个 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 问题,回调对于外行来说可能会成为一个严重的 hell ,特别是当它们是嵌套的和/或它们返回的顺序很重要时。

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

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

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

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

更新:

这个问题更具体地涉及回调之间的参数传递以及当执行在回调之间移动时修改参数。通过将所需的任何信息作为参数传递给解析方法,可以轻松完成此操作。

通常它看起来像这样(使用 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.
}
);

关于JavaScript 初始化回调链中的回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32906955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com