如何在所有数据加载时 运行 一个函数?
How to run a function when all the data loaded?
我在 ArcGIS JS 中异步处理数千个点 API。在主函数中,我调用了处理单个特征的函数,但是我需要在处理完所有特征后才结束处理。应该有一个事件,虽然我没有找到任何事件,恐怕它甚至不存在 - 很难说最后处理的项目是 最后一个 全部。 .ajaxStop()
should do this, but I don't use jQuery, just Dojo. Closest what I found in Dojo was Fetch and its OnComplete,但据我所知,它是从 AJAX 获取数据,而不是从其他 JS 函数获取数据。
我现在唯一的解决方法是测量要处理的特征数量,然后在输出点数组达到所需长度时触发,但我首先需要计算所需的数量。但是如何在加载时做到这一点?将数据跟踪到从服务器读取数据的位置意味着修改我什至不应该知道的功能,这是不可能的。
编辑 - 我的一些代码:
addData: function (data) {
dojo.addOnLoad(
this.allData = data,
this._myFunction()
);
},
一些评论:
data
是图形数组
- 当我在调试器中查看
data
时,它的计数是 2000,然后是 3000,然后是 4000...
- 没有
dojo.addOnLoad
,计数开始接近零,现在大约是 2000,但仍然是实际数字的一小部分
_myFunction()
处理 this._allData
中的所有 2000...3000...4000... 图形,并且 returns 错误的结果,因为它需要它们全部正常工作
- 我需要延迟
_myFunction()
的执行,直到所有数据加载完毕,也许是通过其他事件而不是 dojo.addOnLoad
。
我已经想到的解决方法:
a) setTimeout()
这显然是一个错误的选择 - 如果 data
包含太多项目,那么等待任何神奇的毫秒数都无法挽救我,甚至会延迟数组中单个点的情况.
b) 基于长度的延迟
我可以用这样的东西替换事件:
if(data.length == allDataCount) {
this._myFunction();
}
setTimeout(this._thisFunction, someDelay);
或相同的一些其他实现,通过循环或在异步调用的函数中递增的计数器。问题是如何确保 allDataCount
变量是确定的,而不仅仅是到目前为止领先的功能数量。
EDIT2:指向 definitely helped me, but the best I found on converting synchronous code to a deferred was this simple example 的延期和承诺。我可能误解了什么,因为它并没有比原来的同步代码更好地工作,this.allData
仍然不能保证保存所有数据。加载函数现在看起来像这样:
addData: function (data) {
var deferred = new Deferred();
this._addDataSync(data, function (error, result) {
if (error) {
deferred.reject(error);
}
else {
deferred.resolve(result);
}
});
deferred.promise.then(this._myFunction());
},
_addDataSync: function (data, callback) {
callback(this.allData = data);
},
我知道延迟的大多数用例假设从某个服务器请求数据。但这是我第一次可以在不破坏我不应该更改的功能的情况下处理数据,因此无法将数据跟踪回请求。
addonload是等待dom。
如果您正在等待一个函数完成 运行,则使用另一个函数 deferred/promises。
需要有关您的计划的更多信息才能为您提供更具体的答案..
我有点解决了我的问题,延迟调用我的层的构造函数,直到地图完全加载并且 "onUpdateEnd"
事件触发。这可能是应该如何正确完成的方式,所以我 post 这是一个答案,而不是对我的问题的编辑。另一方面,我无法控制 class 的其他调用,我更愿意有另一道防线来防止不完整的输入,或者至少有一种方法来判断我是否应该抱怨不完整的数据,所以我不接受答案,并打开问题以获得更多答案。
这在我重新加载页面时不起作用,但后来 ,所以我现在可以将 "onUpdateEnd"
与范围更改或任何其他事件结合使用。这完全可以满足我的需求。
我在 ArcGIS JS 中异步处理数千个点 API。在主函数中,我调用了处理单个特征的函数,但是我需要在处理完所有特征后才结束处理。应该有一个事件,虽然我没有找到任何事件,恐怕它甚至不存在 - 很难说最后处理的项目是 最后一个 全部。 .ajaxStop()
should do this, but I don't use jQuery, just Dojo. Closest what I found in Dojo was Fetch and its OnComplete,但据我所知,它是从 AJAX 获取数据,而不是从其他 JS 函数获取数据。
我现在唯一的解决方法是测量要处理的特征数量,然后在输出点数组达到所需长度时触发,但我首先需要计算所需的数量。但是如何在加载时做到这一点?将数据跟踪到从服务器读取数据的位置意味着修改我什至不应该知道的功能,这是不可能的。
编辑 - 我的一些代码:
addData: function (data) {
dojo.addOnLoad(
this.allData = data,
this._myFunction()
);
},
一些评论:
data
是图形数组- 当我在调试器中查看
data
时,它的计数是 2000,然后是 3000,然后是 4000... - 没有
dojo.addOnLoad
,计数开始接近零,现在大约是 2000,但仍然是实际数字的一小部分 _myFunction()
处理this._allData
中的所有 2000...3000...4000... 图形,并且 returns 错误的结果,因为它需要它们全部正常工作- 我需要延迟
_myFunction()
的执行,直到所有数据加载完毕,也许是通过其他事件而不是dojo.addOnLoad
。
我已经想到的解决方法:
a) setTimeout()
这显然是一个错误的选择 - 如果 data
包含太多项目,那么等待任何神奇的毫秒数都无法挽救我,甚至会延迟数组中单个点的情况.
b) 基于长度的延迟
我可以用这样的东西替换事件:
if(data.length == allDataCount) {
this._myFunction();
}
setTimeout(this._thisFunction, someDelay);
或相同的一些其他实现,通过循环或在异步调用的函数中递增的计数器。问题是如何确保 allDataCount
变量是确定的,而不仅仅是到目前为止领先的功能数量。
EDIT2:指向 this.allData
仍然不能保证保存所有数据。加载函数现在看起来像这样:
addData: function (data) {
var deferred = new Deferred();
this._addDataSync(data, function (error, result) {
if (error) {
deferred.reject(error);
}
else {
deferred.resolve(result);
}
});
deferred.promise.then(this._myFunction());
},
_addDataSync: function (data, callback) {
callback(this.allData = data);
},
我知道延迟的大多数用例假设从某个服务器请求数据。但这是我第一次可以在不破坏我不应该更改的功能的情况下处理数据,因此无法将数据跟踪回请求。
addonload是等待dom。 如果您正在等待一个函数完成 运行,则使用另一个函数 deferred/promises。
需要有关您的计划的更多信息才能为您提供更具体的答案..
我有点解决了我的问题,延迟调用我的层的构造函数,直到地图完全加载并且 "onUpdateEnd"
事件触发。这可能是应该如何正确完成的方式,所以我 post 这是一个答案,而不是对我的问题的编辑。另一方面,我无法控制 class 的其他调用,我更愿意有另一道防线来防止不完整的输入,或者至少有一种方法来判断我是否应该抱怨不完整的数据,所以我不接受答案,并打开问题以获得更多答案。
这在我重新加载页面时不起作用,但后来 "onUpdateEnd"
与范围更改或任何其他事件结合使用。这完全可以满足我的需求。