我正在使用promise.each
循环遍历2个数据库查询bookshelfjs
,但是角色没有给我roles[resource.get('name')] = role.get('name');
this- >的结果,但是它给了我来自slect语句的对象:
var promise = new Promise(
function resolver(resolve, reject) {
var roles = {};
Promise.each(user.relations.relates.models, function(relation){
return Resource.forge({resourceId: relation.get('resourceId')}).fetch().then(function(resource){
return Role.forge({roleId: relation.get('roleId')}).fetch().then(function(role){
roles[resource.get('name')] = role.get('name');
return roles;
}).catch(function(err){
reject({"status":"error", "data": err});
});
}).catch(function(err){
reject({"status":"error", "data": err});
});
}).then(function(roles){
resolve(roles);
});
}
);
return promise;
从Bluebird文档中获得Promise.each()
:
解析为未经修改的原始数组,该方法用于产生副作用。
因此,这意味着您执行以下操作:
Promise.each(array).then(function(val) {
// iteration finished here
// val is the original array
});
那val
将是您传入的原始数组,而不是您的roles
对象。
因为您的roles
对象在较高范围内,所以可以删除roles
在.then()
处理程序中声明的参数,而直接引用较高范围的roles
变量。
您还应该避免在这里使用promise构造函数的反模式,而不是创建新的promise,而只是返回您已经拥有的那个。
您可以这样做:
var roles = {};
return Promise.each(user.relations.relates.models, function (relation) {
return Resource.forge({resourceId: relation.get('resourceId')}).fetch().then(function (resource) {
return Role.forge({roleId: relation.get('roleId')}).fetch().then(function (role) {
roles[resource.get('name')] = role.get('name');
});
}).catch(function (err) {
// repackage how the error is presented into our own object
throw ({"status": "error", "data": err});
});
}).then(function () {
// make the resolved value of the final promise be the roles object
return roles;
});
此返回的promise的已解析值将是您的roles
对象。
变更摘要:
Promise.each()
从而不是从创建新的承诺返回承诺(无需在此处创建新的承诺)。.then()
处理程序中Promise.each()
,删除已命名的已声明参数,roles
因为该参数与更高范围的roles
对象冲突。roles
该.then()
处理程序,使其成为您要返回的promise的解析值。.catch()
因为外层.catch()
也可以工作。.catch()
以引发重新包装的错误值。return roles;
因为它是不需要的。该roles
对象在更高的范围内始终可用,因此无需使其成为这些内部承诺的已解决值(实际上,这样做可能会造成混淆)。可能的性能优化。由于您的结果都不取决于先前的结果,因此看来您可以并行运行所有异步操作,而不必串行运行,在这种情况下,您可以将替换Promise.each()
为Promise.map()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句