Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 手动bluebird promise中的resolve()_Javascript_Node.js_Bluebird - Fatal编程技术网

Javascript 手动bluebird promise中的resolve()

Javascript 手动bluebird promise中的resolve(),javascript,node.js,bluebird,Javascript,Node.js,Bluebird,超级基本问题:我对nodeJS和Promises都是新手,很好奇我是否正确使用了resolve() \u查询帮助器(查询,字段) { 返回新承诺((解决、拒绝)=>{ connector.query(查询,字段,(错误,结果)=>{ 如果(错误) { 连接器。回滚(()=>{ 拒绝(错误); } ); } 如果(结果) { 返回解析(结果); } 解决(); }); }); }; //稍后会做一些类似的事情: 此._queryHelper('SELECT*自secretTable,其中'gen

超级基本问题:我对nodeJS和Promises都是新手,很好奇我是否正确使用了resolve()

\u查询帮助器(查询,字段)
{
返回新承诺((解决、拒绝)=>{
connector.query(查询,字段,(错误,结果)=>{
如果(错误)
{
连接器。回滚(()=>{
拒绝(错误);
} );
}
如果(结果)
{
返回解析(结果);
}
解决();
});
});
};
//稍后会做一些类似的事情:
此._queryHelper('SELECT*自secretTable,其中'generatedURL`=?',stringIn)
。然后((resultin)=>{
如果(!resultin | | resultin.length==0){
//干坏事
}
否则{
//做点别的
}

});如果您只是询问您的代码是否可以工作,那么当您没有错误时,您的结果值应该显示在您希望的位置

解析(结果)
将使
结果
显示在
处理程序中。然后()

我发现您的代码存在三个主要问题:

  • 您的错误处理工作不正常
  • 如果未定义
    结果
    ,则会出现逻辑问题
  • 您缺少处理错误的
    .catch()
  • 您的
    处理程序中存在逻辑问题。如果由于以下原因而没有结果,则()

    if (results.length) 
    
    结果
    未定义
    时将抛出。为了安全起见,您可以将
    if
    更改为:

    if (!results || results.length === 0)
    

    您还应该修复出现错误时会遇到的问题,以便在出现错误时不调用
    resolve()
    。我建议改为:

       _queryHelper(query, fields) {
           return new Promise((resolve, reject) => {
               connector.query(query, fields, (error, results) => {
                   if (error) {
                       connector.rollback(() => {
                           reject(error);
                       });
                   } else {
                       resolve(results);
                   }
               });
           });
       };
    
       // later on doing something like:
       this._queryHelper('SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn).then((resultsIn) => {
           if (!resultsIn || resultsIn.length === 0) {
               // do somthing
           } else {
               // do something else
           }
       }).catch(err => {
           // handle errors here
       });
    

    如果您只是询问代码是否可以工作,那么当您没有错误时,您的结果值应该显示在您希望的位置

    解析(结果)
    将使
    结果
    显示在
    处理程序中。然后()

    我发现您的代码存在三个主要问题:

  • 您的错误处理工作不正常
  • 如果未定义
    结果
    ,则会出现逻辑问题
  • 您缺少处理错误的
    .catch()
  • 您的
    处理程序中存在逻辑问题。如果由于以下原因而没有结果,则()

    if (results.length) 
    
    结果
    未定义
    时将抛出。为了安全起见,您可以将
    if
    更改为:

    if (!results || results.length === 0)
    

    您还应该修复出现错误时会遇到的问题,以便在出现错误时不调用
    resolve()
    。我建议改为:

       _queryHelper(query, fields) {
           return new Promise((resolve, reject) => {
               connector.query(query, fields, (error, results) => {
                   if (error) {
                       connector.rollback(() => {
                           reject(error);
                       });
                   } else {
                       resolve(results);
                   }
               });
           });
       };
    
       // later on doing something like:
       this._queryHelper('SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn).then((resultsIn) => {
           if (!resultsIn || resultsIn.length === 0) {
               // do somthing
           } else {
               // do something else
           }
       }).catch(err => {
           // handle errors here
       });
    
    我的理解正确吗,
    结果
    被传递给我的
    。然后
    作为
    resultin
    回调

    是的,这和预期的一样

    但是,您的代码不起作用,因为即使出现错误,您也总是调用
    resolve()
    。这是一个问题,尤其是当您在回滚连接器后尝试
    拒绝()。您需要一个

    return new Promise((resolve, reject) => {
        connector.query(query, fields, (error, results) => {
            if (error) {
                connector.rollback(() => {
                    reject(error);
                });
            } else { // <===
                if (results)
                    return resolve(results);
                resolve();
            }
        });
    });
    

    也就是说,对于Bluebird,当存在以下情况时,您不需要使用
    Promise
    构造函数:

    或者更简单:

    Promise.promisifyAll(connector);
    
    function _queryHelper(query, fields) {
        return connector.queryAsync(query, fields).catch(error => {
            return connector.rollbackAsync().throw(error);
        });
    }
    
    我的理解正确吗,
    结果
    被传递给我的
    。然后
    作为
    resultin
    回调

    是的,这和预期的一样

    但是,您的代码不起作用,因为即使出现错误,您也总是调用
    resolve()
    。这是一个问题,尤其是当您在回滚连接器后尝试
    拒绝()。您需要一个

    return new Promise((resolve, reject) => {
        connector.query(query, fields, (error, results) => {
            if (error) {
                connector.rollback(() => {
                    reject(error);
                });
            } else { // <===
                if (results)
                    return resolve(results);
                resolve();
            }
        });
    });
    

    也就是说,对于Bluebird,当存在以下情况时,您不需要使用
    Promise
    构造函数:

    或者更简单:

    Promise.promisifyAll(connector);
    
    function _queryHelper(query, fields) {
        return connector.queryAsync(query, fields).catch(error => {
            return connector.rollbackAsync().throw(error);
        });
    }
    

    谢谢,这正是我所追求的,我想确保我的决心(结果)和我的.然后(结果)之间的链接是正确的,听起来好像我是。谢谢你的逻辑捕捉!因为看起来你是新来的,如果你下面的任何一个答案回答了你的问题,那么你可以通过单击最佳答案旁边的绿色复选标记向社区表明这一点。这也将为您在堆栈溢出上按照正确的过程赢得一些声誉点数。谢谢,这正是我所追求的,我想确保我的解析(结果)和.then(结果)之间的链接正确,听起来好像是这样。谢谢你的逻辑捕捉!因为看起来你是新来的,如果你下面的任何一个答案回答了你的问题,那么你可以通过单击最佳答案旁边的绿色复选标记向社区表明这一点。这也将为您在堆栈溢出上获得一些声誉点数,因为您遵循了正确的过程。@itscience-我添加了关于您还有两个错误的信息。@itscience-我添加了关于您还有两个错误的信息。