NodeJs обещает вернуться слишком рано

Я новичок в NodeJs, и код, с которым я работаю, использует Q framework для обещаний.
И кажется, что я не слишком хорошо понимаю структуру «Q», я сталкиваюсь с ситуацией, когда обещания возвращаются слишком рано.
Вот мой код:

BridgeInfo.getBridgeInfo(exten)
        .then(function processBridgeInfo(bridge_info) {
          console.log("Nitesh -- bridge info is back, yay");
          if (bridge_info !== undefined) {
            conf_bridge = new VoxConfBridge(ari);
            conf_bridge.init(bridge_info);

            /**Add the bridge to the bridgeList**/
            bridgeList[conf_bridge.bridge.id] = conf_bridge;
            console.log("Bridge ID to register is "+ conf_bridge.bridge.id);

            self.registerEvents(conf_bridge.bridge);
            conf_bridge.registerUser(event, false, channel);
          } else {
            console.log("Unknown extension [" + exten + "] blocking it");
            ChannelDriver.blockChannel(ari, channel.id);
          }
        })
        .catch(function handleError(err) {
          console.error("Nitesh -- [voxbridgemanager] error occured "+err);
        });

Приведенный выше код вызывает функцию getBridgeInfo, эта функция должна выполнять некоторые запросы к БД и возвращать результат.
Вот код в getBridgeInfo

BridgeInfo.getBridgeInfo = Q.async(function(bridge_identifier) {
  console.log("Nitesh -- Getting the bridge info for  ["+ bridge_identifier + "]");
  if (bridge_identifier !== undefined) {
    db.getConfBridgeProfile(bridge_identifier)
    .then(function processBridgeProfile(result) {
      if (result !== undefined) {
        console.log("Nitesh -- Bridge Info is "+ JSON.stringify(result));
        var bridge_info = new BridgeInfo();
        bridge_info.init(result)
        .then (function bridgeInfoInitDone() {
          return bridge_info;
        })
        .catch( function handleError(err) {
          console.error("Nitesh ---[bridgeInfoInit] Error is "+ err);
        });
      }
      else {
        console.log("Can't find any bridge profile for this identifier ["+ bridge_identifier + "]");
      }
    }, function handleError(err) {
      console.error("Failed to retrieve bridgeInfo");
    });
  } else {
    console.error("Received an invalid identifier");
  }
});

**Когда я запускаю этот код, я вижу,что в моем основном коде, который вызывает getBrigeInfo, он попадает в обработчик ошибок catch еще до того, как getBRidgeInfo был выполнен полностью, результаты запроса SQL getBridgeInfo появляются после.

Я думаю, что то, как я использую обещания, не делается правильно, любые объяснения, пожалуйста

1 ответ

  1. Вы упускаете ключевую часть того, что могут сделать обещания.

    Инструкции catch в getBridgeInfo выполнять не нужно. Вы должны вернуть все обещание, которое получает данные SQL… и обработайте его в первом блоке кода BridgeInfo.getBridgeInfo (exten)

    Предполагая, что db.getConfBridgeProfile (bridge_identifier); возвращает обещание

    Образец:

    BridgeInfo.getBridgeInfo = function(bridge_identifier) {
      console.log("Nitesh -- Getting the bridge info for  ["+ bridge_identifier + "]");
      if (bridge_identifier !== undefined) {
         return Q.fcall(function () {
            throw new Error("Received an invalid identifier");
         });  
      }
      return db.getConfBridgeProfile(bridge_identifier); 
    }
    

    Я также отделил ваш запрос процесса… держите вещи простыми.

    BridgeInfo.processBridgeProfile = function(result) {
      if (result !== undefined) {
         console.log("Nitesh -- Bridge Info is "+ JSON.stringify(result));
         var bridge_info = new BridgeInfo();
         return bridge_info.init(result);
      }else{
         return Q.fcall(function () {
            throw new Error("Can't find any bridge profile for this identifier ["+ bridge_identifier + "]");
         });
      }
    

    Возвратите обещания и отрегулируйте задвижку в главной функции. Вы застряли в обработке улова, результаты SQL не возвращаются, как они должны.

    Вызов:

    BridgeInfo.getBridgeInfo(bridge_identifier).then(function(result){
       return BridgeInfo.processBridgeProfile(result)
    }).then(function(){
      //Do the rest here
    }).catch(function(){
      //One catch to rule them all :)
    });