2016-04-16 5 views
1

ich einen Benutzer-API und einen Teil des API-Code bin die Gestaltung ist wie folgt:auf einer externe Funktion ein Versprechen zurück mit Asynchron-Daten von einer inneren Funktion zurück

module.exports = { 
    findByEmail: (email) => { 
    db.collection('Users').findOne(email: email), (err, result) => { 
     assert.equal(err, null); 
     return new Promise(resolve) => { 
     resolve(result); 
     } 
    } 
    } 
} 

Meine Absicht ist hier findByEmail Rückkehr zu machen ein Versprechen, so dass er aufgerufen wie sein: wie oben nicht erreicht

require('./models/User').findByEmail({email: '[email protected]'}) 
.then((user) => { 
    console.log('User account', user); 
}); 

jedoch definieren meine API, was ich will, da die innere Funktion derjenige, der das Versprechen zurück, während die externe Funktion (dh ist findByEmail) endet damit, dass kein Abschlussball zurückgegeben wird iss. Wie stelle ich sicher, dass die externe Funktion ein Versprechen mit den Daten zurückgibt, die von der inneren Funktion zurückgegeben werden?

Natürlich ist es eine Option, die externe Funktion einen Callback akzeptieren zu lassen, aber das würde bedeuten, dass die externe Funktion nicht mehr verhandelbar ist.

Antwort

3

Geben Sie zuerst das Versprechen zurück, dann lassen Sie die versprochene Rückruffunktion den Rest erledigen.

module.exports = { 
    findByEmail: (email) => { 
    return new Promise((resolve, reject) => { 
     db.collection('Users').findOne(email: email), (err, result) => { 
     // assert.equal(err, null); 
     if (err) { 
      reject(err); 
     } 
     resolve(result); 
     } 
    } 
    } 
} 
+0

Oh genannt wird ja ! Ich kann nicht glauben, dass ich das vermisst habe: | –

+0

@AlexanderMac In diesem Beispiel nicht benötigt. Ein Versprechen kann nur "einmal" gelöst oder abgelehnt werden. Einige mögen es bevorzugen, dort eine Rückkehr zur Klarheit zu sehen, es ist nicht für eine korrekte Ausführung erforderlich. Wenn irgendeine zusätzliche Verarbeitung stattfindet, wäre natürlich die Rückkehr erforderlich. –

0

Hier Im die Objekte() aufrufen, in dem Jquery Ajax-Aufruf nach dem Aufstehen die Antwort gegeben wird ich das Versprechen auf eine Funktion getlistings() zurückgegeben wird, die aus einer externen Datei

function Listings(url){ 

var deferred = new $.Deferred(); 
$.ajax({ 
    url: url, 
    method: 'GET', 
    contentType: 'application/json', 
    success: function (response) { 
     deferred.resolve(response); 
    }, 
    error: function (response){ 
     deferred.reject(response); 
    } 
}); 
return deferred.promise(); 
}; 

// call from external file 

function getListings(){ 
Listings('/listings.json').then(function(response){ 

console.log(response); 
}); 

}