在回调和事件之后调用方法
Call a method after a callback and an event
我有一个模块,它有四个函数,一个接一个地调用。我正在努力遵循揭示模块模式。其中一项功能是公共的,其余功能是私人的。它是这样的:
- 从另一个模块调用
publicMethod
- 从
publicMethod
调用queryNames
- 从
queryNames
调用execute(parameters, callback?, errback?)
addNamesList
被调用为execute
的callback?
自变量- 创建了几个
dijit/form/CheckBox
,并触发了方法querySegments
onChange
- CCD_ 12需要调用在CCD_ 13中创建的对象的方法
问题是在步骤6中,我无法访问在步骤1中创建的对象。
在步骤3中,我曾尝试使用dojo-hatch来定义callback?
参数,但我无法使其发挥作用。我尝试将this
放在它的第一个参数中,但即使这样,我也无法达到调用addNamesList
所需的范围。
这里有一些代码来演示这个问题。
define([
'dojo/dom',
'dijit/form/CheckBox',
'esri/layers/ArcGISDynamicMapServiceLayer',
'esri/tasks/query',
'esri/tasks/QueryTask',
'dojo/_base/lang'
],
function (
dom,
CheckBox,
ArcGISDynamicMapServiceLayer,
Query, QueryTask,
lang
) {
// ***************
// private methods
// ***************
// fetch names and call addNamesList to put the list in place
var queryNames = function (map, mapLayer) {
// new QueryTask(url, options?)
var queryTask = new QueryTask("url")
var query = new Query()
// execute(parameters, callback?, errback?)
// this callback passes an argument called featureSet
queryTask.execute(query, lang.hitch(map, "addNamesList", mapLayer), function(error) {console.log(error)})
}
// callback function of queryNames
var addNamesList = function (mapLayer, featureSet) {
console.log('addOplist')
var namesCount = featureSet.features.length
for (var i = 0; i <namesCount; i++) {
// work
var cbox = new CheckBox({
id: "cbox_" + i,
value: featureSet.features[i].attributes["someID"],
checked: false,
onChange: function (evt) {
querySegments(this.value, mapLayer)
}
})
cbox.placeAt("someDiv" + i, "first")
}
}
// triggered by the checkbox event
var querySegments = function (name, mapLayer) {
// build the query
var queryStatement = "someID = " + name
var layerDefinitions = [queryStatement]
// call a method of mapLayer
mapLayer.setLayerDefinitions(layerDefinitions)
}
// **************
// public methods
// **************
var publicMethod = function (map) {
var mapLayer = new ArcGISDynamicMapServiceLayer('restURL')
map.addLayer(mapServiceLayer)
queryNames(map, mapLayer)
return mapLayer
}
return {
publicMethod: publicMethod
}
}
)
您可以看到我在代码审查中提出的另一个(更广泛的)问题的更详细的解释和工作示例。
我是JavaScript的新手,我想我在范围界定、闭包和回调方面仍然有很多问题。
我将非常感谢任何意见,包括如何改进这个问题。
编辑
使用当前的实现(使用dojo挂接),不会引发任何错误。没有调用方法addNamesList
(也没有调用errback
,我也不明白为什么)。我认为这是因为addNamesList
不在map
的(挂接第一个参数)命名空间中。我试着用this
代替,但没有什么区别。
在我决定使用挂接之前,代码看起来是这样的:
var queryNames = function (map, mapLayer) {
...
queryTask.execute(query, addNamesList)
}
var addNamesList = function (featureSet) {
...
...
...
querySegments(this.value, mapLayer)
}
但随后我无法在复选框事件触发的方法内访问CCD_ 22。它会抛出Uncaught ReferenceError: mapLayer is not defined
。这就是我尝试使用挂接的原因。
Javascript是异步的,所以大部分数据来自db、http请求或通过回调返回的任何东西。以下是代码中发生的情况:
- 公共方法调用queryNames
- queryNames异步调用
map
的addNamesList
,不返回任何结果 - 公共方法收回了控制权,同时
addNamesList
也发生了一些事情 mapLayer
原封不动地返回,而一些东西仍在后台进行
因此,为了避免这种情况,您应该通过回调从公共方法返回数据,因此将callback
作为第二个参数传递给公共方法,然后传递给querySegments。然后,在query
的成功回调中,当您最终准备好结果时,您执行:
callback(mapLayer);
所以,你应该做的一切就是根据需要将这个callback
传递到你准备好mapLayer
的地方(所以你已经完成了你想要的一切),然后做一个callback(mapLayer);
。
这个和这个可能会解释得更好。
致以最良好的问候,Alexander
- 未捕获错误:无法在初始化之前调用方法;
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何避免在angular上多次调用方法;s ng重复
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 从window.onbeforeunload调用方法背后的代码
- 当输入字段为空时,如何在angular中调用方法
- 函数调用方法有什么用
- 多次调用方法后返回相同promise的模式
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 茉莉花 - 未调用方法
- jQuery如何在原型中调用方法
- ng显示“;调用方法“;不起作用
- Odoo销售点如何访问模型并使用JS调用方法
- 从React调用方法.JS州
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何在对象中调用方法
- 检查对话框是否为 Open 会引发“初始化前无法在对话框上调用方法”错误
- 在输入类型提交按钮上调用 C# 方法
- 通过类选择器单独调用方法