Javascript 我在使用承诺和异步时哪里出了问题?

Javascript 我在使用承诺和异步时哪里出了问题?,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我在“apiCalls.js”文件中编写了一个函数,具有以下功能: function getAllData() { new Promise(function(resolve, reject) { async.parallel([ function(callback) { request('http://urlcall', function(error, response, body) { if(!error && res

我在“apiCalls.js”文件中编写了一个函数,具有以下功能:

function getAllData() {
  new Promise(function(resolve, reject) {
    async.parallel([
      function(callback) {
        request('http://urlcall', function(error, response, body) {
          if(!error && response.statusCode == 200) {
            return callback(null, body);
          }
          return callback(error || new Error('Response non-200'));
        });
      },
      function(callback) {
        request('http://urlcall', function(error, response, body) {
          if(!error && response.statusCode == 200) {
            return callback(null, body);
          }
          return callback(error || new Error('Response non-200'));
        });
      },
    ],
    function(err, results) {
      if(err) {
        console.log(err);
        reject(err);
      }
      console.log(results);
      resolve(results);
    });
  });
}
然后在app.js文件中调用此函数:

apiCalls.getAllData().then(function(returned) {
    console.log(returned);
    res.render('home');
  });
我收到一个错误,其中返回的值未定义:
TypeError:无法读取未定义的属性“then”


我不确定我会错在哪里。我已经解析了承诺,然后在then函数中使用了该值。我是不是遗漏了什么?我不熟悉使用承诺和异步编程,所以我在这里对它应该如何工作缺乏一些理解吗?

首先,你真的不想把承诺和简单的回调与
异步
库混为一谈。您需要选择一个模型(承诺或回调)并在一个模型中编程所有控制流。因此,如果您正转向Promissions(世界上大多数地方都是这样),那么就完全跳过异步库。在这种特殊情况下,
Promise.all()
用于两个并行请求

然后,考虑承诺您拥有的最低级别的异步操作,因为它允许您对所有控制流和错误处理使用承诺。在您的例子中,这就是请求库,它已经有了一个被称为请求承诺的承诺版本。此外,它已经自动为您检查非2xx状态(并拒绝承诺),因此您无需编写代码。因此,您似乎可以用以下内容替换您拥有的所有内容:

const rp = require('request-promise');    // promise version of the request library

function getAllData() {
    return Promise.all([rp('http://urlcall1'), rp('http://urlcall2')]);
}
然后,您可以将其与
一起使用。然后()


首先,您没有从
getAllData()
函数返回承诺。您可以尝试
返回新的承诺…
将承诺和
异步
一起使用是错误的-这两种风格不能很好地混合。使用
请求承诺
承诺。全部
代替。谢谢,这是我得到的关于承诺的最好解释!
apiCalls.getAllData().then(returned => {
    console.log(returned);
    res.render('home', returned);
}).catch(err => {
    console.log(err);
    res.sendStatus(500);
});