Inf*_*f.S 0 javascript firefox
很确定这已经被问到了,但我不知道该搜索什么.无论如何,
var livemarks = [];
var livemarkIds = PlacesUtils.annotations.getItemsWithAnnotation("livemark/feedURI", {});
for (var i = 0; i < livemarkIds.length; i++){
PlacesUtils.livemarks.getLivemark( {id : livemarkIds[i]}, function(result, livemark){
if (result == Components.results.NS_OK){
livemarks.push(livemark);
}
});
}
alert(livemarks.length);
Run Code Online (Sandbox Code Playgroud)
我试图玩一个不再由其创建者维护的Firefox插件,只是为了学习一点.我最近得到一个错误,说getFeedURI将被弃用,我想改变他的旧功能.
编辑:
从函数(内部函数)中定义的函数,我无法访问父类中定义的var.为什么?例如,我无法从getLivemark()内部或其他类似的内部函数访问var livemarks.
我正在检查(完全向下滚动):这和他的代码工作正常.那我的代码出了什么问题?如果可能的话,我只是想避免递归.
我怀疑该PlacesUtils.livemarks.getLivemark函数是异步工作的,所以在你发出警报后调用你的回调函数length.将警报置于回调中,您应该看到正确的长度(最终).这是一种方式:
var expecting = livemarkIds.length;
for (var i = 0; i < livemarkIds.length; i++){
PlacesUtils.livemarks.getLivemark( {id : livemarkIds[i]}, function(result, livemark){
if (result == Components.results.NS_OK){
livemarks.push(livemark);
// ***New stuff***
if (livemarks.length === expecting) {
// Now you have them all, now you can do the next thing
doSomethingWithTheLiveMarks(livemarks);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,我把livemarkIds.length到expecting,万一你做其他事情livemarkIds,而功能正在运行.如果你不是,你可以直接使用它.
你的评论如下:
但是,系统的工作原理如下:我在一个数组中获得了livemark.这段代码实际上是在一个类(和方法)中,所以另一个类初始化这个代码并调用函数getFeeds(),它将返回该实况标记数组.
如果PlacesUtils.livemarks.getLivemark是异步的,这是不可能的getFeeds,以数组返回作为返回值.例如,它不能像这样使用:
a = b;
c = 42;
feeds = getFeeds(feedIds);
if (feeds.length === 0) {
// Do something
}
else {
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
好消息是它很容易修复:getFeeds接受它有源时调用的回调函数.上面的代码更改为如下所示:
a = b;
c = 42;
feeds = getFeeds(feedIds, function(feeds) {
if (feeds.length === 0) {
// Do something
}
else {
// Do something else
}
});
Run Code Online (Sandbox Code Playgroud)
如您所见,这是一个非常直接的变化.假设上面的循环是所有的getFeeds,那么getFeeds最终看起来是这样的:
function getFeeds(livemarkIds, callback) {
var livemarks = [];
for (var i = 0; i < livemarkIds.length; i++){
PlacesUtils.livemarks.getLivemark( {id : livemarkIds[i]}, function(result, livemark){
if (result == Components.results.NS_OK){
livemarks.push(livemark);
if (livemarks.length === livemarkIds.length) {
// Done, trigger the callback
callback(livemarks);
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
并且模式仍在继续:如果代码调用getFeeds是由其他东西调用的,那就是期望异步内容的返回值,而不是返回该值,您可以让代码接受回调,并从getFeeds回调中调用回调.等等.
一旦你习惯它,它很容易做到.习惯它可能会很棘手.:-)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |