Javascript 使用从内部函数返回的异步数据返回外部函数的承诺

Javascript 使用从内部函数返回的异步数据返回外部函数的承诺,javascript,promise,ecmascript-6,es6-promise,Javascript,Promise,Ecmascript 6,Es6 Promise,我正在设计一个用户API,部分API代码如下: module.exports = { findByEmail: (email) => { db.collection('Users').findOne(email: email), (err, result) => { assert.equal(err, null); return new Promise(resolve) => { resolve(result);

我正在设计一个用户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: 'user@example.com'})
.then((user) => {
  console.log('User account', user);
});
但是,像上面这样定义API并不能实现我想要的,因为内部函数是返回承诺的函数,而外部函数(即
findByEmail
)最终不返回承诺。如何确保外部函数使用内部函数返回的数据返回承诺


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

首先返回promise,然后让promise回调函数完成其余的操作

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

在这里,我调用listings(),其中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);
});

}

哦,是的!真不敢相信我漏掉了这个:|@AlexanderMac在这个例子中是不需要的。承诺只能解决或拒绝
一次
。有些人可能更愿意看到一个回归,因为它不是正确执行所必需的。当然,如果有任何其他处理正在进行,则需要返回。