javascript - Sequelize 等到循环完成回调

标签 javascript node.js promise sequelize.js

来自 php 背景,我正在努力了解这个回调问题。

基本上我想获取一些行,然后我想遍历这些行并根据其他模型(不同的数据库)检查它们。我希望回电等到它们全部循环并检查完毕。

回调在 sequelize 循环遍历所有结果之前被调用。

基本上我希望函数是“阻塞的”。我需要更改什么?

toexport.getlasttransactions = function(lower,upper,callback){
    var deferred = Q.defer();
    var transactionsToUpdate = [];
    ///////////////////////////
    // set import conditions //
    ///////////////////////////
    var lowerbound = (lower) ? lower.format() : moment.utc().subtract(10, 'minutes').format();
    var upperbound = (upper) ? upper.format() : moment.utc().format();

    ///////////////////////////////
    // get IDs From Failed syncs //
    ///////////////////////////////
    FailedSync.find({ limit: 100 })
    .then(function(res){
        var FailedIDs = [];
        _.each(res, function(value,index){
            FailedIDs.push(value.transaction_id);
        });

        // build condition
        var queryCondition = { where: { updated_at: { between: [lowerbound,upperbound] } }, limit: 3 };
        if(FailedIDs.length > 0){
            queryCondition = {
                where: Sequelize.and({ updated_at: { between: [lowerbound,upperbound] } },
                Sequelize.or(
                  { id: FailedIDs }
                ))
            }
        }
        //////////////////////////////
        // get Phoenix Transactions //
        //////////////////////////////
        PhoenixTransaction
        .findAll(queryCondition)
        .then(function(poenixTrx){

            _.each(poenixTrx, function(value, index){

                Transaction.findOne({ where: { id: value.id }})
                .then(function(result){

                    if(!result || result.length === 0){
                        transactionsToUpdate.push(value);
                        console.log('!result || result.length === 0')
                    }
                    else if(result && result.length === 1){
                        if(result.hash != value.hash){
                            transactionsToUpdate.push(value);
                            console.log('result.hash != poenixTrx[i].hash')
                        }
                    }




                })
                .catch(function(err) {
                  console.log(err)
                })


            })
            deferred.resolve(transactionsToUpdate);


        })
        .catch(function(err){
          throw new Error("Something went wrong getting PhoenixTransaction") 
        })

    })

    deferred.promise.nodeify(callback);
    return deferred.promise;    

}

最佳答案

您的代码中有很多新 promise 用户的模式:

  • 您在不需要时使用了延迟。
  • 您没有使用 promise 聚合方法
  • 您不是在适当的地方等待事物,而是嵌套。

promise 代表随时间变化的值(value)。您可以在以后使用 promises 并通过 then 访问它们的结果,而不仅仅是立即 - Sequelize 的 promises 基于 bluebird 并提供丰富的 API 来为您进行聚合。 这是清理代码的注释版本 - 请注意它不是嵌套:

toexport.getlasttransactions = function(lower,upper){ // no need for callback
    var lowerbound = (lower || moment.utc().subtract(10, 'minutes')).format();
    var upperbound = (upper || moment.utc()).format();
    // use `map` over a `each` with a push.
    var failedIds = FailedSync.find({ limit: 100 }).map(function(value){ 
        return value.transaction_id;
    });
    // build condition.
    var queryCondition = {
        where: { updated_at: { between: [lowerbound,upperbound] } }, limit: 3 
    };
    var query = failedIds.then(function(ids){ // use promise as proxy
        if(ids.length === 0) return queryCondition;
        return { // You can return a value or a promise from `then`
            where: Sequelize.and({ updated_at: { between: [lowerbound,upperbound] } },
                   Sequelize.or({ id: ids});
        };
    });
    var pheonixTransactions = query.then(function(condition){
        return PhoenixTransaction.findAll(queryCondition); // filter based on result
    });
    return pheonixTransactions.map(function(value){ // again, map over each
        return Transaction.findOne({ where: { id: value.id }}); // get the relevant one
    }).filter(function(result){ // filter over if chain and push
        return (!result || result.length === 0) || 
               ((result && result.length === 1) && result.hash != value.hash);
    });
};

关于javascript - Sequelize 等到循环完成回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503617/

相关文章:

mysql - 获取 Sequelize Association 生成的错误查询

javascript - js : str. 用 Promise 替换()

javascript - node.js 模块 ntwitter 不工作

javascript - 选择下拉样式函数jquery

javascript - 如何使用expressjs连接?

node.js - 从 ColumnSet 访问源对象

javascript - 如何轻松地将 javascript 版本迁移到谷歌地图的新版本?

javascript - 在嵌套数组中查找和编辑?

javascript - $q.all 为所有值返回 undefined

javascript - 在等待 Promise 时切换 AngularJS View