蓝鸟答应每一个都不返回最后的结果

阿尔文

我正在使用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;
jfriend00

从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对象。

变更摘要:

  1. Promise.each()从而不是创建新的承诺返回承诺(无需在此处创建新的承诺)。
  2. 让拒绝传播回去,无需手动拒绝更高级别的承诺。
  3. 在的.then()处理程序中Promise.each(),删除已命名的已声明参数,roles因为该参数与更高范围的roles对象冲突
  4. 返回roles.then()处理程序,使其成为您要返回的promise的解析值。
  5. 移除内层,.catch()因为外层.catch()也可以工作。
  6. 更改.catch()以引发重新包装的错误值。
  7. 删除内部,return roles;因为它是不需要的。roles对象在更高的范围内始终可用,因此无需使其成为这些内部承诺的已解决值(实际上,这样做可能会造成混淆)。

可能的性能优化。由于您的结果都不取决于先前的结果,因此看来您可以并行运行所有异步操作,而不必串行运行,在这种情况下,您可以将替换Promise.each()Promise.map()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

蓝鸟承诺在摩卡/柴测试中的每一个都不起作用

For循环返回最后一个结果

在对每一个和返回结果使用Lambda和流

Foreach 循环只返回最后一个结果

Foreach循环仅返回最后一个结果

purrr的每一个都不适合is.na

每个then()应该返回一个值或抛出,答应/总是返回

每一个都发出几次?

Gnuplot:怪异的每一个行为

每一个?Clojure中的身份

foreach内部foreach只返回最后一个结果吗?

我怎么知道最后一个异步函数何时在“ for key in ob”循环中返回结果?

ruby 模板中的深度层次查找仅返回最后一个结果

使用grep -f,但它仅返回与列表中最后一个模式匹配的结果

公式在最后一个数据上返回错误的结果

动态addeventlistener onclick仅返回数组的最后一个结果

蓝鸟的promise。包装方法的函数返回一个promise,可以吗?

从查找返回最后一个文档

按月返回最后一个条目

Mongo db Collection查找从第一个条目返回的结果,而不是从客户端的最后一个条目返回的结果

如何为多个目录中的每一个查找最后n个最新文件

仅从大型输入文件中提取与多个模式中的每一个匹配的最后一行

如何保存将多个结果集返回到SSIS中的临时表的SP的最后一个结果集?

当最后一个都不提交时如何合并两个提交?

每个ChatID返回一个结果

BeautifulSoup 只返回一个结果

如何优雅地创建一个返回lambda返回值或什么都不返回的函数?

由System.identityHashCode方法返回的哈希码唯一地分配给每一个对象?

需要火力的每一个消息之后,只有每天一次,并不会返回日期