2016-02-11 5 views
3

Я пробовал обещание сингборта узла, я не могу использовать разрешение & отклонить в тогда функциях. ниже мой код, который вызывает PromiseКак реализовать обещание bluebird в nodejs

modules.modelClip.exGetAllClips(sUserData) 
      .then(function(finalResult) { 
        console.log("Final result " + finalResult) 
      }) 
      .error(function(e) { 
        console.log("Error handler " + e) 
      }) 
      .catch(function(e) { 
        console.log("Catch handler " + e) 
      }); 

и функция exGetAllClips Возвращает обещание.

exports.exGetAllClips = function(pUserData) { 
     console.log("--- inside : clipModel : exGetAllClips -----------------------------------------------------"); 
     console.log(pUserData); 

     return new modules.promise(function(resolve, reject) { 
      modules.dbConnection.getConnection(function(rErrorCon, connection) { 
        if (rErrorCon) { 
         reject(rErrorCon); 
        } else { 
         resolve(connection); 
        } 
      }); 
     }).then(function(connection) { 
      console.log('Result 4 ') 
      var sClipQuery = "CALL spGetAllClips(?)"; 
      var query = connection.query(sClipQuery, [pUserData.selfId 
      ]); 
      query.on('error', function(err) { 
        // Handle error, an 'end' event will be emitted after this as well 
        //return err; 
        console.log(" error : spGetAllClips : ",err); 
       reject(err); 
      }).on('result', function(row) { 
        console.log("row : ", JSON.stringify(row)); 
        resolve(row); 
      }).on('end', function() { 
        // all rows have been received 
        connection.release(); 
      }) 

     }); 
}; 

Я хочу, чтобы бросить ошибку из .then, если существует. Но не в состоянии сделать это, он бросает ошибку отклонения undefined.

Пожалуйста, помогите, как реализовать этот или любой другой способ.

ответ

1

Я бы это так, первое есть две функции обратного вызова (один на самом деле EventHandler, я не совсем комфортно, используя Обещания справиться с этим), поэтому разделить их на два обещания:

  • использования getConnectionAsync вместо getConnection, пообещав весь модуль.

  • следовать bluebird docs для обработки разовых событий (заметьте, я не поддерживать флаг, чтобы проверить, если обещание уже решено), код может быть как:

    modules.dbConnection = modules.promise.promisifyAll(modules.dbConnection); 
    ... 
    
    exports.exGetAllClips = function(pUserData) { 
        console.log("--- inside : clipModel : exGetAllClips -----------------------------------------------------"); 
        console.log(pUserData); 
    
        return modules.dbConnection.getConnectionAsync() 
        .then(function(connection) { 
         console.log('Result 4 ') 
         var sClipQuery = "CALL spGetAllClips(?)"; 
         return new modules.promise(function(resolve, reject){ 
          var query = connection.query(sClipQuery, [pUserData.selfId]); 
          query.on('error', function(err) { 
          // Handle error, an 'end' event will be emitted after this as well 
          //return err; 
          console.log(" error : spGetAllClips : ",err); 
           reject(err); 
          }).on('result', function(row) { 
          console.log("row : ", JSON.stringify(row)); 
          resolve(row); 
          }).on('end', function() { 
          // all rows have been received 
          connection.release(); 
          }); 
         }); 
    }; 
    
+0

да это то, что я хочу, даже я упомянул аналогичный пример, http://zpalexander.com/blog/javascript-promises-node-js/ – pitu

Смежные вопросы