注意:我引导了一个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!
}
答案 0 :(得分:1)
这是一个很好的Javascript问题,回调对于初学者来说可能会成为一个严重的地狱,特别是当它们被嵌套和/或它们返回的顺序很重要时。
这是承诺的来源:它们是Javascript开发的必备工具,即将成为标准的一部分(在EcmaScript 6中)。
本质上:promise是一个从函数返回的对象,该函数具有在异步操作(例如API调用)完成时调用的方法(回调)。 promise和回调之间的区别在于promises允许你构建处理回调的方式,重要的是,以什么顺序。
我最近编写了一个方法,每次调用必须进行30次api调用,这取决于前一个调用的结果(这不是一个设计良好的api)。你能想象用回调试图做到这一点吗?事实上,我创建了一个promises数组,并使用jQuery.when()来处理所有api调用完成后的事情。
目前我们需要使用图书馆来承诺。 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.
}
);