0

我在循环中遇到异步回调问题。我在 Window 的一个文件对象上调用一个异步函数以获取有关它的更多信息 ( getImagePropertiesAsync()) 并将这些信息保存到数据库中,以便更快地进行进一步访问。我需要该函数返回的值以及i调用时的值getImagePropertiesAsync()

for (var i = 0; i < picsGiven.length; i++) {
  picsGiven[i].properties.getImagePropertiesAsync().then(function(prop){
    settings.values["geoLat" + i2] = props.latitude;
    settings.values["geoLon" + i2] = props.longitude;
    settings.values["geoDate" + i2] = props.dateTaken;
    i2++;
  })
}

由于异步执行,成对的三个值以错误的顺序保存。在我写这篇文章的时候,我已经担心这个问题了。下次试试。

for (var i = 0; i < picsGiven.length; i++) {
  picsGiven[i].properties.getImagePropertiesAsync().then((function(prop, i2){
    settings.values["geoLat" + i2] = props.latitude;
    settings.values["geoLon" + i2] = props.longitude;
    settings.values["geoDate" + i2] = props.dateTaken;
  })(undefined, i))
}

现在,我得到了i正确的,但props未定义。(逻辑上)。

我怎么可能i在保存的同时正确获得props?提前致谢!

4

2 回答 2

1

(未经测试)是这样的:

function mk_handleImagePropertiesAsync(ival) {
  return function(prop) {
    settings.values["geoLat" + ival] = prop.latitude;
    settings.values["geoLon" + ival] = prop.longitude;
    settings.values["geoDate" + ival] = prop.dateTaken;
  }
}

for (var i = 0; i < picsGiven.length; i++) {
  picsGiven[i]
    .properties
    .getImagePropertiesAsync()
    .then(mk_handleImagePropertiesAsync(i));
}

范围问题!for 循环不会像 C/C++ 那样引入新的块作用域。循环中的内联函数将始终获得相同的 i2 值(它的初始值!)

于 2013-08-02T07:20:53.777 回答
0

试试这个

for (var i = 0; i < picsGiven.length; i++) {
       picsGiven[i].properties.getImagePropertiesAsync().then(function(i){
           return function(prop){
               //your code  here you can use i
           }
       }(i));
    }
于 2013-08-02T07:36:02.220 回答