Estoy tratando de enviar un booleano al cliente para saber cuándo finaliza la llamada asíncrona del servidor. Para hacer eso, hice una promesa con otras funciones como esta:

'container.stop': function(id) {
        return new Promise(Meteor.bindEnvironment(function(resolve) {
          var ctn = docker.getContainer(id);
          ctn.stop(Meteor.bindEnvironment(function(err, data) {
              if (err) {
                  resolve(false);
              } else {
                  console.log(data);
                  resolve(true);
              }
          }));
        }));
    },

así que este es el ejemplo de una Promesa que funciona, que el cliente recibe cuando finaliza

PERO ahora uso una función que es un poco diferente y no puedo encontrar cómo devolver algo al cliente:

    'machine.stop': function(name) {
            new Machine(name).stop(Meteor.bindEnvironment(function(err) {
                console.log("Server (stop):" + name)
                if (!err) {
                    checkAlerte(name);
                    InfosMachines.upsert({
                        nameMachine: name,
                    }, {
                        nameMachine: name,
                        stateMachine: 'stopped'
                    });
                    upsertCollectionMachines();
                    //inspect the machine we have created to get her name + data + id
                    new Machine(name).inspect(Meteor.bindEnvironment(function(err, result) {
                        if (!err) {
                            // get all datasources
                            var myDatasource;
                            var theIDToDelete;
                            return new Promise(Meteor.bindEnvironment(function(resolve) {
                                // take the ds with the same name as the host
                                HTTP.call("GET", 'http://localhost:3000/api/datasources/name/' + ("datasource_" + result.name), {
                                        headers: {
                                            'Accept': 'application/json',
                                            'Content-Type': 'application/json',
                                            'Authorization': APIKEY,
                                        },
                                    },
                                    function(error, result) {
                                        if (!error) {
                                            myDatasource = result.data;
                                            resolve(myDatasource);
                                        } else {
                                            console.error(error);
                                        }
                                    });
                            })).then(Meteor.bindEnvironment(function(myDatasource) {
                                // delete the ds with the id
                                deleteDataSource(myDatasource.id);
                                resolve(true);
                            }));
                        }
                    }));

                } else {
                    console.error(err);
                }
            }));
        },

aquí el cliente no recibe nada más que el código del servidor funciona (la máquina se detiene y se llama a deleteDatasource

Como puede ver, quiero devolver algo cuando se ha llamado a la función deleteDatasource.

Alguien me podria ayudar? ¿Y es correcto como hice mi promesa de esperar en "mi DataSource" para hacer el then(?

[EDITAR] ¿Debo hacer algo como esto para devolver algo cuando la última parte haya terminado:

then(Meteor.bindEnvironment(function(myDatasource /*cest la valeur de myDatasource*/) {
                          console.log("4TH step");
                            // delete the ds with the id
                            deleteDataSource(myDatasource.id);
                            return new Promise(Meteor.bindEnvironment(function(resolve) {
                              resolve(true);
                            }));
                        }));
0
Jerome 8 mar. 2017 a las 11:47

2 respuestas

La mejor respuesta

Con la ayuda de @JaromandaX y @aedm descubrí que debería poner otra Promesa que contenga todo el código como este:

'machine.stop': function(name) {
      return new Promise(Meteor.bindEnvironment(function(resolve) {
        new Machine(name).stop(Meteor.bindEnvironment(function(err, data) {
            console.log("Server (stop):" + name)
            console.log("1ST STEP");
            if (!err) {
                checkAlerte(name);
                InfosMachines.upsert({
                    nameMachine: name,
                }, {
                    nameMachine: name,
                    stateMachine: 'stopped'
                });
                upsertCollectionMachines();
                //inspect the machine we have created to get her name + data + id
                new Machine(name).inspect(Meteor.bindEnvironment(function(err, result) {
                  console.log("2ND STEP");
                    if (!err) {
                        // get all datasources
                        var myDatasource;
                        var theIDToDelete;
                         new Promise(Meteor.bindEnvironment(function(resolve) {
                          console.log("3RD step");
                            // take the ds with the same name as the host
                            HTTP.call("GET", 'http://localhost:3000/api/datasources/name/' + ("datasource_" + result.name), {
                                    headers: {
                                        'Accept': 'application/json',
                                        'Content-Type': 'application/json',
                                        'Authorization': APIKEY,
                                    },
                                },
                                function(error, result) {
                                    if (!error) {
                                        myDatasource = result.data;
                                        //dit a then que myDataSource est fait
                                        resolve(myDatasource);
                                    } else {
                                        console.error(error);
                                    }
                                });
                        })).then(Meteor.bindEnvironment(function(myDatasource /*cest la valeur de myDatasource*/) {
                          console.log("4TH step");
                            // delete the ds with the id
                            deleteDataSource(myDatasource.id);
                        }));

                        resolve(true);
                    }
                }));

            } else {
                console.error(err)
            }
        }));
      }));
    },
0
Jerome 8 mar. 2017 a las 09:34

Si un método Meteor devuelve una Promesa, se resuelve antes de regresar al cliente.

Sus métodos container.stop devuelven una promesa, es por eso que el resultado que pasa a resolve se devuelve al cliente. machine.stop no tiene un valor de retorno, por lo tanto, el servidor Meteor no espera el resultado antes de responder la llamada Meteor.call.

0
aedm 8 mar. 2017 a las 09:02