Javascript 我在使用承诺和异步时哪里出了问题?
我在“apiCalls.js”文件中编写了一个函数,具有以下功能: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
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);
});