gpt4 book ai didi

javascript - 我使用 Promise 和 async 哪里出错了?

转载 作者:行者123 更新时间:2023-12-02 22:38:23 24 4
gpt4 key购买 nike

我在“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');
});

我收到一个错误,其中 then 返回的值未定义:类型错误:无法读取未定义的属性“then”

我不知道我哪里出了问题。我已经解决了 Promise,然后在 then 函数中使用了该值。我在这里错过了什么吗?我对使用 Promise 和异步编程不太熟悉,所以我是否缺少对其工作原理的一些理解?

最佳答案

首先,您确实不想将 Promise 与普通回调与 async 库混合在一起。您需要选择一种模型来使用( promise 或回调)并在一个模型中对所有控制流进行编程。因此,如果您要转向 Promise(世界上大部分地区都是如此),那么完全跳过异步库。在这种特殊情况下,Promise.all() 可以满足您的两个并行请求的目的。

然后,考虑 Promise 最低级别的异步操作,因为这可以让您对所有控制流和错误处理使用 Promise。在您的情况下,这是请求库,它已经有一个名为 request-promise 的 promise 版本。此外,它已经自动为您检查非 2xx 状态(并拒绝 promise ),因此您无需编写代码。因此,看来您可以用以下内容替换您拥有的所有内容:

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

function getAllData() {
return Promise.all([rp('http://urlcall1'), rp('http://urlcall2')]);
}

然后,您可以将其与 .then() 一起使用:

apiCalls.getAllData().then(returned => {
console.log(returned);
res.render('home', returned);
}).catch(err => {
console.log(err);
res.sendStatus(500);
});

关于javascript - 我使用 Promise 和 async 哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58667705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com