then - promise javascript




Cómo devolver los datos de la promesa (3)

Tampoco me gusta usar una función para manejar una propiedad que se haya resuelto una y otra vez en cada controlador y servicio. Parece que no estoy solo: D

No intente obtener resultados con una promesa como variable, por supuesto, de ninguna manera. Pero encontré y uso una solución a continuación para acceder al resultado como una propiedad.

En primer lugar, escriba el resultado a una propiedad de su servicio:

app.factory('your_factory',function(){
   var theParentIdResult = null;
   var factoryReturn = {  
          theParentId: theParentIdResult,
          addSiteParentId : addSiteParentId
   }
    return factoryReturn;
    function addSiteParentId(nodeId) {   
         var theParentId = 'a';
         var parentId = relationsManagerResource.GetParentId(nodeId)
                    .then(function(response){                               
                        factoryReturn.theParentIdResult = response.data;
                        console.log(theParentId);  // #1
           });                    
    }        
})

Ahora, solo necesitamos asegurarnos de que el método addSiteParentId siempre se resuelva antes de acceder a la propiedad theParentId. Podemos lograr esto utilizando algunas formas.

  • Utilice resolver en el método de enrutador:

    resolver: {parentId: function (your_factory) {your_factory.addSiteParentId (); }}

Luego, en el controlador y otros servicios utilizados en su enrutador, simplemente llame a su_factario.elPadenteId para obtener su propiedad. Consulte aquí para obtener más información: http://odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx

  • Utilice el método de aplicación 'run' para resolver su servicio.

    app.run (function (your_factory) {your_factory.addSiteParentId ();})

  • Inyectarlo en el primer controlador o servicios del controlador. En el controlador podemos llamar a todos los servicios de init requeridos. Luego, todos los controladores restantes permanecen como hijos del controlador principal, a los que se puede acceder a esta propiedad normalmente como desee.

La elección de sus formas depende de su contexto depende del alcance de su variable y la frecuencia de lectura de su variable.

Necesito obtener el response.data fuera de la promesa para que pueda ser devuelto por la función adjunta. Sé que probablemente no pueda hacerlo de la forma en que lo he codificado debido al alcance normal de JavaScript. ¿Hay alguna forma de hacerlo?

El console.log en # 1 produce los datos correctos. console.log # 2 siempre produce 'a';

function addSiteParentId(nodeId) {   
    var theParentId = 'a';
    var parentId = relationsManagerResource.GetParentId(nodeId)
                        .then(function(response){                               
                            theParentId = response.data;
                            console.log(theParentId);  // #1
                        });
    console.log(theParentId);  // #2
    return theParentId;
}

Cualquier indicador sería apreciada.


Tienes que devolver una promesa en lugar de una variable. Así que en tu función solo regresa:

return relationsManagerResource.GetParentId(nodeId)

Y luego resolver la promesa devuelta. O puede hacer otro aplazado y resolver el theParentId con él.


Una forma de devolver datos en una promesa es de esta manera

const addSiteParentId = (nodeId) => {   
    const  data = { theParentId: "" }
    relationsManagerResource.GetParentId(nodeId).then((response)=> Object.assign(data, data.theParentId, response.data)/* #1 */);
    return data.theParentId;
}
// Object.assign do this magic
console.log("theParentId:", addSiteParentId(nodeId))

Object.assign: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/assign





angularjs