Return forEach 内的承诺
Return of promise inside forEach
function getNamesById(nameIds) {
var defer = $q.defer();
var result = [];
nameIds.forEach(function (nameId) {
account.getNameById(nameId).then(function (name) {
result[nameId] = name;
});
});
defer.resolve(result);
return defer.promise;
}
我有上面的代码 显然没有按预期工作。
我必须迭代一个 id 数组并构造另一个以 id 为键的数组,以及从异步函数中获取的值
你应该 return 使用 $q.all
的另一个承诺
function getNamesById(nameIds) {
var result = [];
nameIds.forEach(function (nameId) {
result.push(account.getNameById(nameId));
});
return $q.all(result);
}
然后将其链接到其他地方
getNamesById(someNameIds)
.then(...);
更清晰的写法是使用 .map
而不是声明数组并使用 forEach
推入它:
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
}));
}
如果使用 ES6(并且你的方法肯定会忽略除第一个参数之外的所有参数),这可以进一步简化:
let getNamesById = nameIds => Promise.all(nameIds.map(account.getNameById));
因此,根据评论,我推测您正在尝试以 nameId
作为键并以异步调用的结果作为值来获取关联数组。您还需要一个步骤 - 您需要 return 来自 then
的一个值,稍后您可以使用它
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
.then(function(name){
return {id:nameId, name:name};
})
}));
}
当你使用这个方法时,你可以很容易地reduce
结果到你的关联数组
getNamesById(["a","b","c"])
.then(function(results){
var values = results.reduce(function(p,n){
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});
用 ES6 编写使得这更不冗长 - 为了完整性:
function getNamesById(nameIds) {
return $q.all(nameIds.map(
nameId => account.getNameById(nameId)
.then(name => ({id:nameId, name:name}))
);
}
和
getNamesById(["a","b","c"])
.then(results => {
var values = results.reduce((p,n) => {
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});
function getNamesById(nameIds) {
var defer = $q.defer();
var result = [];
nameIds.forEach(function (nameId) {
account.getNameById(nameId).then(function (name) {
result[nameId] = name;
});
});
defer.resolve(result);
return defer.promise;
}
我有上面的代码 显然没有按预期工作。 我必须迭代一个 id 数组并构造另一个以 id 为键的数组,以及从异步函数中获取的值
你应该 return 使用 $q.all
function getNamesById(nameIds) {
var result = [];
nameIds.forEach(function (nameId) {
result.push(account.getNameById(nameId));
});
return $q.all(result);
}
然后将其链接到其他地方
getNamesById(someNameIds)
.then(...);
更清晰的写法是使用 .map
而不是声明数组并使用 forEach
推入它:
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
}));
}
如果使用 ES6(并且你的方法肯定会忽略除第一个参数之外的所有参数),这可以进一步简化:
let getNamesById = nameIds => Promise.all(nameIds.map(account.getNameById));
因此,根据评论,我推测您正在尝试以 nameId
作为键并以异步调用的结果作为值来获取关联数组。您还需要一个步骤 - 您需要 return 来自 then
的一个值,稍后您可以使用它
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
.then(function(name){
return {id:nameId, name:name};
})
}));
}
当你使用这个方法时,你可以很容易地reduce
结果到你的关联数组
getNamesById(["a","b","c"])
.then(function(results){
var values = results.reduce(function(p,n){
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});
用 ES6 编写使得这更不冗长 - 为了完整性:
function getNamesById(nameIds) {
return $q.all(nameIds.map(
nameId => account.getNameById(nameId)
.then(name => ({id:nameId, name:name}))
);
}
和
getNamesById(["a","b","c"])
.then(results => {
var values = results.reduce((p,n) => {
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});