2016-04-16 33 views
1

我设计的API代码的用户API和一部分返回异步数据的外部功能的承诺如下:返回与从内部功能

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

我在这里的目的是使findByEmail回报一个承诺,以便它可以被调用,如:

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

然而定义我的API像上面并没有达到我想要的,因为内部函数是返回的承诺之一,而外部功能(即findByEmail )最终没有返回舞会伊势。我如何确保外部函数使用内部函数返回的数据返回一个promise?

当然,使外部函数接受回调是一种选择,但这意味着外部函数不再是可行的。

回答

3

先回复承诺,然后让承诺回调函数完成剩下的工作。

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

叫哦,是的!不能相信我错过了这个:| –

+0

@AlexanderMac在此示例中不需要。一次承诺只能一次解决或拒绝。有些人可能更愿意为了清晰而在那里看到一个回报,这对正确执行不是必需的。如果有任何额外的处理正在进行,当然需要回报。 –

0

这里林呼吁在jQuery的Ajax调用得到我返回承诺的功能getlistings(响应后作出的列表()),这是从外部文件

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); 
}); 

}