我如何 return 这个承诺的数组?
how can I return the array from this promise?
我已经尝试了一些方法并一直在阅读,但我似乎无法弄清楚如何从这个函数中 return 名称数组。
function getNames(oauth2Client, docs) {
const api = x('v1');
let names = [];
return Promise.each(docs, function(doc) {
let req = api.users.messages.get;
let options = ({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
});
return Promise.promisify(req)(options).then(function(response) {
for (y = 0; y < response.names.length; y++) {
names.push(response.names[y].toLowerCase());
}
})
.catch(function (err) {
console.log('An error occured: ' + err.message);
throw err;
});
});
}
我不确定您使用的是什么 Promise 库,因为它看起来不是标准的,但我认为这样的东西就是您想要的。我为正在发生的事情添加了评论 - 您可能需要更改这些代码行以适合您的 promise 库。
function getNames(oauth2Client, docs) {
const api = x('v1');
const names = [];
// create a stack of promises
const stack = [];
docs.forEach(doc => {
let req = api.users.messages.get;
let options = ({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
});
// push each promise onto the stack
stack.push(
Promise.promisify(req)(options).then(function(response) {
for (y = 0; y < response.names.length; y++) {
names.push(response.names[y].toLowerCase());
}
})
.catch(function (err) {
console.log('An error occured: ' + err.message);
throw err;
})
);
});
// Wait for all promises in the stack to finish, and then
// return the names array as the final value.
return Promise.all(stack).then(() => names);
}
只需添加
return Promise.each(…)
.then(function() {
return names;
});
这会导致返回的承诺用 names
数组实现。
但是我建议您不要在 each
循环中使用全局数组,尤其是在您关心结果顺序的情况下。相反,用一个值解决每个承诺,使用 map
而不是 each
,最后合并结果:
const api = x('v1');
const getUserMessages = Promise.promisify(api.users.messages.get);
function getNames(oauth2Client, docs) {
return Promise.map(docs, doc =>
getUserMessages({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
})
.then(response =>
response.names.map(name => name.toLowerCase());
)
)
.then(nameArrays =>
[].concat(...nameArrays)
);
}
我已经尝试了一些方法并一直在阅读,但我似乎无法弄清楚如何从这个函数中 return 名称数组。
function getNames(oauth2Client, docs) {
const api = x('v1');
let names = [];
return Promise.each(docs, function(doc) {
let req = api.users.messages.get;
let options = ({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
});
return Promise.promisify(req)(options).then(function(response) {
for (y = 0; y < response.names.length; y++) {
names.push(response.names[y].toLowerCase());
}
})
.catch(function (err) {
console.log('An error occured: ' + err.message);
throw err;
});
});
}
我不确定您使用的是什么 Promise 库,因为它看起来不是标准的,但我认为这样的东西就是您想要的。我为正在发生的事情添加了评论 - 您可能需要更改这些代码行以适合您的 promise 库。
function getNames(oauth2Client, docs) {
const api = x('v1');
const names = [];
// create a stack of promises
const stack = [];
docs.forEach(doc => {
let req = api.users.messages.get;
let options = ({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
});
// push each promise onto the stack
stack.push(
Promise.promisify(req)(options).then(function(response) {
for (y = 0; y < response.names.length; y++) {
names.push(response.names[y].toLowerCase());
}
})
.catch(function (err) {
console.log('An error occured: ' + err.message);
throw err;
})
);
});
// Wait for all promises in the stack to finish, and then
// return the names array as the final value.
return Promise.all(stack).then(() => names);
}
只需添加
return Promise.each(…)
.then(function() {
return names;
});
这会导致返回的承诺用 names
数组实现。
但是我建议您不要在 each
循环中使用全局数组,尤其是在您关心结果顺序的情况下。相反,用一个值解决每个承诺,使用 map
而不是 each
,最后合并结果:
const api = x('v1');
const getUserMessages = Promise.promisify(api.users.messages.get);
function getNames(oauth2Client, docs) {
return Promise.map(docs, doc =>
getUserMessages({
auth: oauth2Client,
'userId': 'me',
'id': doc.id
})
.then(response =>
response.names.map(name => name.toLowerCase());
)
)
.then(nameArrays =>
[].concat(...nameArrays)
);
}