代码之家  ›  专栏  ›  技术社区  ›  Vishal

已调用回调。但在那之前我从未打过电话。异步中的错误。平行的[副本]

  •  0
  • Vishal  · 技术社区  · 7 年前

    我在网上对这个问题做了很多研究,但仍然不知道问题的原因。

    问题是,当我使用异步库中的并行函数时,我遇到了一个错误:

    Callback was already called.
    

    var sendNotificationAddToMyRememberNew = function(request, response, restaurant) {
    
        async.parallel({
            notification_list: function (callback) {
                models.NotificationList.create({
                    alert_msg: "Restaurant " + restaurant.name + " remembered.",
                    payload: JSON.stringify({
                        restaurant_id: restaurant.id,
                        restaurant_name: restaurant.name,
                        restaurant_image: restaurant.image
                    }),
                    type: constants.NOTIFICATION_TYPE.RESTAURANT_REMEMBERED,
                    platform_type: constants.MOBILE_PLATFORM_TYPE.ALL,
                    status: constants.NOTIFICATION_STATUS.SENT,
                    device_token: null,
                    device_arn: null,
                    schedule_time: moment.utc(),
                    customer_id: request.token.customer_id,
                    customer_email: request.token.email,
                    created_date: moment.utc(),
                    updated_date: moment.utc()
                }).then(function(notificationList){
                    callback(null, notificationList);
                }).catch(function(error){
                    callback(error);
                });
            },
            badge_count: function(callback) {
    
                models.CustomerBadgeCount.findOrCreate({
                    where: {
                        customer_id: request.token.customer_id
                    },
                    defaults: {
                        badge_count: 1,
                        customer_id: request.token.customer_id,
                        created_date: moment.utc(),
                        updated_date: moment.utc()
                    }
                }).spread(function (badgeCount, created) {
                    if(!created){
                        badgeCount.update(
                            {
                                badge_count: badgeCount.badge_count + 1,
                                updated_date: moment.utc()
                            },
                            {
                                fields:[
                                    "badge_count",
                                    "updated_date"
                                ]
                            }
                        ).then(function(badgeCount) {
                            callback(null, badgeCount);
                        }).catch(function (error) {
                            callback(error); // Getting error of callback here
                        });
                    }else{
                        callback(null, badgeCount)
                    }
                }).catch(function (error) {
                    callback(error);
                });
    
            },
            devices: function(callback) {
                models.CustomerDeviceTokens.findAll({
                    where: {
                        customer_email: request.token.email
                    }
                }).then(function(devices) {
                    callback(null, devices);
                }).catch(function(error) {
                    callback(error);
                });
            }
        }, function(error, results){
    
            if(error) {
                Logger.logDbError(error,request);
                return console.log(error);
            }
            //callback function
            console.log("-------------------------------------------------------");
            console.log("Notification List: " + JSON.stringify(results.notification_list, null, 4));
            console.log("badge_count: " + JSON.stringify(results.badge_count, null, 4));
    
            if(results.devices && result.devices.count > 0) {
                results.devices.forEach(function(device) {
                    console.log("device_arn: " + device.device_arn);
                }, this);
            }
        });
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   robertklep    7 年前

    如果 callback(null, badgeCount) 抛出错误(如果最终回调由于某种原因抛出错误,则可能发生这种情况)。

    在这种情况下发生的是 .catch 调用处理程序,在其中调用 callback “已调用”

    为了防止这种情况(或者更确切地说,为了捕捉这些错误),您不应该使用 接住 但使用的是 .then :

    .then(function(badgeCount) {
      callback(null, badgeCount);
    }, function (error) {
      callback(error);
    });
    

    .then().catch() 内部 async 操作)

        2
  •  0
  •   Vishal    7 年前

    我用过 findOrCreate

    model.SomeModelName.findOrCreate({
        ....
        ....
    }).spread(function(data, created) {
    
    }).fail(function(err) {
    
    });
    

    正如您在上面的代码中所看到的那样 .spread() 应遵循 .fail() .spread() 然后 .catch() . 回调被调用了两次