我怀疑该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);
}
}
});
}
请注意,我放在那里livemarkIds.length
,expecting
以防您livemarkIds
在函数运行时执行其他操作。如果你不是,你可以直接使用它。
在下面回复您的评论:
然而,系统的工作原理是这样的:我在一个数组中获得了 livemarks。这段代码实际上是在一个类(和方法)中,所以另一个类初始化这个并调用函数 getFeeds(),它将返回那个 livemarks 数组。
如果PlacesUtils.livemarks.getLivemark
是异步的,则不可能getFeeds
将数组作为返回值返回。例如,它不能像这样使用:
a = b;
c = 42;
feeds = getFeeds(feedIds);
if (feeds.length === 0) {
// Do something
}
else {
// Do something else
}
好消息是它真的很容易修复:getFeeds
接受一个回调函数,当它有提要时调用它。上面的代码更改为如下所示:
a = b;
c = 42;
feeds = getFeeds(feedIds, function(feeds) {
if (feeds.length === 0) {
// Do something
}
else {
// Do something else
}
});
如您所见,这是一个非常简单的更改。假设上面的循环是所有的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);
}
}
});
}
}
并且模式继续:如果代码调用getFeeds
被其他期望异步返回值的东西调用,而不是返回该值,您让该代码接受回调,并从回调中调用getFeeds
回调。等等。
一旦你习惯了它,这很容易做到。习惯它可能会很棘手。:-)