gpt4 book ai didi

javascript - 使用 Promise.all() 进行多个 http/oauth 查询

转载 作者:行者123 更新时间:2023-12-03 10:04:23 26 4
gpt4 key购买 nike

我正在尝试等待对 API 的两个 OAuth 调用的输出,但在从这些调用中检索数据时遇到问题。如果我使用 Promise.all(call1,call2).then() 我将获取有关请求对象的信息。

首先,这是 fitbit_oauth 对象的设置:

var fitbit_oauth = new OAuth.OAuth(
'https://api.fitbit.com/oauth/request_token',
'https://api.fitbit.com/oauth/access_token',
config.fitbitClientKey,
config.fitbitClientSecret,
'1.0',
null,
'HMAC-SHA1'
);

foodpath = 'https://api.fitbit.com/1/user/-/foods/log/date/' + moment().utc().add('ms', user.timezoneOffset).format('YYYY-MM-DD') + '.json';
activitypath = 'https://api.fitbit.com/1/user/-/activities/date/' + moment().utc().add('ms', user.timezoneOffset).format('YYYY-MM-DD') + '.json';

Promise.all([fitbit_oauth.get(foodpath, user.accessToken, user.accessSecret),
fitbit_oauth.get(activitypath, user.accessToken,
user.accessSecret)])
.then(function(arrayOfResults) {
console.log(arrayOfResults);
}

我希望 arrayOfResults 为我提供调用中的数据,而不是有关请求的信息。我在这里做错了什么?我对 Promise 很陌生,所以我确信这对于不熟悉 Promise 的人来说很容易。

单个 fitbit_oauth 调用的回调如下:

fitbit_oauth.get(
'https://api.fitbit.com/1/user/-/activities/date/' + moment().utc().add('ms', user.timezoneOffset).format('YYYY-MM-DD') + '.json',
user.accessToken,
user.accessSecret,
function (err, data, res) {
if (err) {
console.error("Error fetching activity data. ", err);
callback(err);
return;
}

data = JSON.parse(data);
console.log("Fitbit Get Activities", data);

// Update (and return) the user
User.findOneAndUpdate(
{
encodedId: user.encodedId
},
{
stepsToday: data.summary.steps,
stepsGoal: data.goals.steps
},
null,
function(err, user) {
if (err) {
console.error("Error updating user activity.", err);
}
callback(err, user);
}
);
}
);

感谢 jfriend00,我成功了,这是新代码:

function fitbit_oauth_getP(path, accessToken, accessSecret) {
return new Promise (function(resolve, reject) {
fitbit_oauth.get(path, accessToken, accessSecret, function(err, data, res) {
if (err) {
reject(err);
} else {
resolve(data);
}
}
)
})};

Promise.all([fitbit_oauth_getP(foodpath, user.accessToken, user.accessSecret),
fitbit_oauth_getP(activitypath, user.accessToken, user.accessSecret)])
.then(function(arrayOfResults) {
console.log(arrayOfResults);
});

最佳答案

Promise.all()仅当异步函数返回 Promise 并且该异步操作的结果成为 Promise 的已解析(或拒绝)值时,才能正常使用异步函数。

Promise.all() 中没有魔法。如果 Fitbit 函数没有返回 promise ,它可以以某种方式知道它们何时完成。

您仍然可以使用Promise.all() ,但是您需要“promisify”fitbit 函数,这是它们周围的一个小包装器,将其正常的回调方法转变为返回一个 Promise,然后根据回调结果解决或拒绝该 Promise。

有关创建 promise 包装器的一些引用:

Wrapping Callback Funtions

How to promisify?

<小时/>

如果您有一个接受回调以提供异步结果的异步函数,例如 fs.rename(oldPath, newPath, callback) ,那么你可以像这样“ promise ”它:

function renameP(oldPath, newPath) {
return new Promise(function(resolve, reject) {
fs.rename(oldPath, newPath, function(err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
};


renameP("orig.txt", "backup.txt").then(function() {
// successful here
}, function(err) {
// error here
});
<小时/>

一些 Promise 库,例如 Bluebird有一个内置.promisify()方法将为您执行此操作(它将返回一个函数 stub ,可以在遵循 Node.js 异步调用约定的任何函数上调用该函数 stub )。

关于javascript - 使用 Promise.all() 进行多个 http/oauth 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30428045/

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