2016-04-16 44 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); 
}); 

}