Javascript 承诺在循环内得到最后一项之后

Javascript 承诺在循环内得到最后一项之后,javascript,promise,Javascript,Promise,这是我的循环: for(var i = 0 ; i < addresses.length ; ++i){ var item = {} item = addresses[i]; var mGeocode = null getGeocode(item.x,item.y).then(function (_mGeocode){ mGeocode = _mGeocode

这是我的循环:

 for(var i = 0 ; i < addresses.length ; ++i){
            var item = {}
            item = addresses[i];

            var mGeocode = null
            getGeocode(item.x,item.y).then(function (_mGeocode){
                mGeocode = _mGeocode
                console.log('mGeocode',mGeocode)
                console.log('item',item) // it shows last loop item
                if(mGeocode.results[3]){
                    item['english_province']    = mGeocode.results[3].address_components[0].long_name
                    item['english_city']        = mGeocode.results[2].address_components[0].long_name 
                }else if(mGeocode.results[2]){
                    item['english_province']    = mGeocode.results[2].address_components[0].long_name
                    item['english_city']        = mGeocode.results[1].address_components[0].long_name 
                }else{
                    alert('change your location')
                    return false;
                }

                newAddresses.push(item)
            });

        }
for(变量i=0;i
我的控制台在
内,然后
打印我循环的最后一个
项目
!!
getGeocode
函数称为google map api

由于使用了
var
,这是一个类关闭问题。使用let将迭代器和项更改为初始化,它将正常工作

for(let i = 0 ; i < addresses.length ; ++i){
            let item = {}
            item = addresses[i];

            var mGeocode = null
            getGeocode(item.x,item.y).then(function (_mGeocode){
                mGeocode = _mGeocode
                console.log('mGeocode',mGeocode)
                console.log('item',item)
                if(mGeocode.results[3]){
                    item['english_province']    = mGeocode.results[3].address_components[0].long_name
                    item['english_city']        = mGeocode.results[2].address_components[0].long_name 
                }else if(mGeocode.results[2]){
                    item['english_province']    = mGeocode.results[2].address_components[0].long_name
                    item['english_city']        = mGeocode.results[1].address_components[0].long_name 
                }else{
                    alert('change your location')
                    return false;
                }

                newAddresses.push(item)
            });

        }
for(设i=0;i
这是由于使用了
var
而导致的类关闭问题。使用let将迭代器和项更改为初始化,它将正常工作

for(let i = 0 ; i < addresses.length ; ++i){
            let item = {}
            item = addresses[i];

            var mGeocode = null
            getGeocode(item.x,item.y).then(function (_mGeocode){
                mGeocode = _mGeocode
                console.log('mGeocode',mGeocode)
                console.log('item',item)
                if(mGeocode.results[3]){
                    item['english_province']    = mGeocode.results[3].address_components[0].long_name
                    item['english_city']        = mGeocode.results[2].address_components[0].long_name 
                }else if(mGeocode.results[2]){
                    item['english_province']    = mGeocode.results[2].address_components[0].long_name
                    item['english_city']        = mGeocode.results[1].address_components[0].long_name 
                }else{
                    alert('change your location')
                    return false;
                }

                newAddresses.push(item)
            });

        }
for(设i=0;i
你的问题是什么?你的循环抛出
n
调用
getGeocode
,每次都增加
i
。当这些
getGeocode
调用完成时,循环早已完成。此时
i
的值将是上次设置的值(最终迭代)。这篇文章解释得很好:你的问题是什么?你的循环抛出
n
调用
getGeocode
,每次都增加
i
。当这些
getGeocode
调用完成时,循环早已完成。此时
i
的值将是上次设置的值(最终迭代)。本文对此进行了充分的解释: