2017-07-12 6 views
0

私はインターネット上でこの問題に関する多くの研究を行っていますが、依然として問題の原因を知ることができませんでした。コールバックは既に呼び出されています。しかし、私はその前にコールバックを呼び出すことはありません。 async.parallelのバグ?

問題は、私は、ライブラリ非同期から並列機能を使用する場合、私はエラーを取得しています、次のとおりです。ここで

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); 
     } 
    }); 

} 
+0

約束事でasync.jsを使用しないでください。平野の「Promise.all」ははるかに簡単です。 – Bergi

+0

@Bergiこの質問は重複していません。私はこの質問を解決しました。私の答えを見てください。 – Vishal

+0

重複は、原因となる[.then(...、...)と '.then(...).catch(...)'](https://stackoverflow.com/q/24662289/1048572)の違いを説明しています'callback'を2回呼び出すためです。 – Bergi

答えて

0

私はfindOrCreateのコードを使用してコードを整理しました。 findOrCreateの元の構文は次のとおりです。

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

}).fail(function(err) { 

}); 

あなたは.spread().fail()が続くべきである、しかし、私のコードでは、私は.catch()続い.spread()を使用したことを上記のコードで見ることができるように。 ブロックが実行されたため、コールバックが2回呼び出されました

+0

それはあなたが 'then'の中でどのように例外を得るかかもしれませんが、実際の問題ではありません。 – Bergi

1

これは、callback(null, badgeCount)がエラーをスローする場合に発生します(何らかの理由で最終コールバックがエラーをスローすると発生する可能性があります)。その場合にはどうなり

あなたはメッセージ「すでにいわゆる」で、その結果、再びcallbackを呼び出している、.catchハンドラが呼び出されていることです。あなたのコード内の他のすべての場所のため

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

(および類似:これを防ぐには(というか、これらのエラーをキャッチするために)、あなたは.catchを使用しますが.thenの2引数バージョンを使用するべきではありません

操作の中で.then().catch()を使用しています)

+0

良い答え!!!!!!しかし、私はそれを理解した。私は別のものを掲示します。答えとあなたの時間をありがとう。 – Vishal

関連する問題