Проблема асинхронности при попытке рекурсивного вызова API - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь построить словарь, основанный на вызовах API, которые мне нужно сделать, предоставляя API определенный идентификатор для каждого вызова.После этого процесса мне нужно оперировать сгенерированным словарем.Проблема в том, что я не могу заставить асинхронность работать должным образом.

Я пытался реализовать Promises безуспешно.

var self = this;


    function fillPropertyDict(){
        var itemsProcessed = 0;
        return new Promise(function(resolve) {

            //Loop for every ID
            self._bimIds.forEach((bimId) => {
                itemsProcessed++;

                //Calling the API
                self.viewer.model.getProperties(bimId, (resultado) => {
                    resultado.properties.forEach((prop) => {
                        if(prop.displayName == 'Type' && prop.displayCategory == 'BIM 360') {
                            var foundIndex = self._propertyDictionary.findIndex(x => x.dbId == bimId)
                            if (foundIndex > 0){
                                self._propertyDictionary[foundIndex].equipment = prop.displayValue
                            } else {
                                var el = new Object();
                                el.dbId = bimId;
                                el.equipment = prop.displayValue;
                                el.sap = '';
                                self._propertyDictionary.push(el);
                            }

                        } else if (prop.displayName == 'Description' && prop.displayCategory == 'BIM 360') {
                            var foundIndex = self._propertyDictionary.findIndex(x => x.dbId == bimId)
                            if (foundIndex > 0){
                                self._propertyDictionary[foundIndex].sap = prop.displayValue
                            } else {
                                var el = new Object();
                                el.dbId = bimId;
                                el.equipment = '';
                                el.sap = prop.displayValue;
                                self._propertyDictionary.push(el);
                            }

                        }
                    })

                })
            //If count reaches array length, resolve Promise
            if(itemsProcessed == self._bimIds.length){
                //Resolve inside callback
                resolve(self._propertyDictionary);
            }

            })
        });   
    }




    //Call function
    fillPropertyDict().
    then(function(result) {
        //Let's print the dictionary  
        console.log('Lets see self._propertyDictionary'); 
        console.log( JSON.parse(JSON.stringify(result)) );  
        console.log(result);   

}

Я хотел бы видеть фактический словарь, когда я вызываюфункция, содержащая обещание (fillPropertyDict ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...