2016-11-20 3 views
0

Ich verwende Sequelize Datenbank orm und durch diesen Code alsMeine Rückkehr Ergebnis von Promise ist <pending>

model.create(
    { 
     username: 'John' 
    }).then(function (result) { 
    return result.userUniqueId; 
}); 

ich neue Benutzer in der Datenbank erstellen und i userUniqueId innerhalb von then() drucken.

erstellen, nachdem Benutzer Ich mag userUniqueId in anderen Funktionen zurückgegeben verwenden, oder nur, dass auf der Konsole drucken, aber ich kann nicht mehr zurück result.userUniqueId aus, dass für dieses Problem behebt Ich versuche Promise zu benutzen Sie führen dann zum Einsatz I dass auf:

'use strict'; 

module.exports = { 
    createNewUser: function (model) { 
     return new Promise(
      function (resolve, reject) { 
       model.create(
        { 
         username: 'John' 
        }).then(function (result) { 
        return result.userUniqueId; 
       }); 
      }) 
      .then(function (result) { 
       resolve(result.userUniqueId); 
      }); 
    }, 
}; 

aber ich bekomme dieses Ergebnis außerhalb von createNewUser Funktion als console.log(controller.createNewUser(models.users));

Ergebnis:

Promise { <pending> } 

Wie kann ich dieses Problem lösen?

UPDATE:

'use strict'; 

module.exports = { 
    createNewUser: function (model) { 
     return new Promise((resolve, reject) => { 
      return model.create(
       { 
        username: 'John' 
       }) 
       .then(function (result) { 
        return result.userUniqueId; 
       }) 
       .then(value => resolve(value)); 
     }); 
    }, 
}; 

und

var userId = controller.createNewUser(models.users) 
     .then(function (userId) { 
      return userId; 
     }); 

console.log(userId); 

Druck Versprechen Objekt

Antwort

0

Das ist kein Problem. Abgesehen von Zusagen, die aufgelöst oder zurückgewiesen werden (direkt mit Promise.resolve() bzw. Promise.reject()), werden alle Versprechen im Status "pending" erstellt. Dieser Status ändert sich, wenn die Funktion resolve() des Promise aufgerufen wird.

Als beiseite, fiel Sie in die Promise Konstruktor Antipattern. Statt dessen:

return new Promise((resolve, reject) => { 
    doSomething() 
    .then(value => resolve(value)); 
}); 

Just do

return doSomething() 

Keine Notwendigkeit zu wickeln Versprechen mit zusätzlichen Versprechen Konstrukteure.

+0

meinen Beitrag mit Ihrer Hilfe aktualisiert, aber ich bekomme Versprechen Objekt wieder –

0

Genau wie bei jedem Versprechen, müssen Sie then nutzen, um ihren Ergebniswert zuzugreifen:

controller.createNewUser(models.users) 
    .then(function (userId) { 
     // do something with the ID 
    }); 

Sie können den Wert aus dem Versprechen nicht direkt zugreifen, weil das Versprechen noch wird nicht aufgelöst.

Auch wie Madara darauf hinweist, sind Sie in das explizite Versprechen der Bau Antipattern gefallen. Lassen Sie sich von den fremden Code befreien:

module.exports = { 
    createNewUser: function (model) { 
     return model.create(
      { 
       username: 'John' 
      }) 
      .then(function (result) { 
       return result.userUniqueId; 
      }); 
    }, 
}; 
+0

Es tut mir leid, Sir, ich glaube, ich verstehe nicht genau, was Ihre durchschnittliche, nach meinem Code, um Ihren Code ändern Als 'module.exports' bekomme ich Promise-Objekt und deinen Code als' controller.createNewUser (models.users) ...'lösche mein Problem nicht, weil ich Ergebnis in' 'then()' benutzen muss und ich Variable als 'createNewUser' Funktion zuweisen möchte –

+0

Mein Pfosten aktualisierte sir –

+0

@ tux-Welt Zeigen Sie uns den Code, in dem Sie versuchen, das zu verwenden Rückgabewert von 'createNewUser', und nicht nur eine einzelne Zeile. – JLRishe

Verwandte Themen