最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

异步等待正确的顺序不执行功能

IT培训 admin 3浏览 0评论

异步/等待正确的顺序不执行功能

我有异步/等待功能的序列,但它们似乎在建议执行并不被阻止由await陈述的顺序来执行。我使用Twilio和Sequelize但我想异步的问题,可诊断无这两种包装的知识。对不起张贴这么多的代码,但我觉得我需要包括所有的它来解释这个问题。

我的主要代码是:

app.post('/sms',async function(req,res){
    try{
        worker=await worker.updateWorker('+18005559999',process.env.TWILIO_OFFLINE_SID);
        responseValue="/sms: worker "+worker.friendlyName+" updated to: "+worker.activityName;
        console.log(responseValue);
        res.status(200).send();

    }
    catch(err){
        console.log("/sms error: "+err);
    }
}

worker.updateWorker()是在ES6类定义如下:

async updateWorker(contact_uri,activitySid){
        console.log("updateWorker: getting workerSid from database");
        workerSid=await database.getWorkerSid(contact_uri);
        console.log("updateWorker: workerSid is "+workerSid);
        worker=await this.updateWorkerFromSid(workerSid,activitySid);
        console.log("updateWorker: worker's friendlyName is "+worker.friendlyName);
        return worker;
    }

database.getWorkerSid()是:

getWorkerSid(contact_uri){
        return new Promise(function(resolve,reject){
            sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
            { type: sequelize.QueryTypes.SELECT})
            .then(result=>{
                if(result.length==0){
                    resolve(null);
                }
                else{
                    resolve(result[0].sid);
                }
            })
            .catch(err=>reject(err));
        });
    }

this.updateWorkerFromSid()是:

async updateWorkerFromSid(workerSid,activitySid){
        var worker;
        try{
            worker=await this.workspace.workers(workerSid)
                        .update({
                            activitySid:activitySid
                        });
            console.log("updateWorkerFromSid: worker has been updated to activity: "+worker.activityName);
            return worker;
        }
        catch(err){
            console.log("updateWorkerFromSid error: "+err);
        }
        finally{
            return worker;
        }

    }

我最终得到的控制台是:

updateWorker: getting workerSid from database
Executing (default): select * from worker where contact_uri='+18005559999'
/sms error: ReferenceError: workerSid is not defined

因此,这让我觉得,我们得到尽可能在sequelize.query()database.getWorkerSid()呼叫,但随后继续执行,而不必等待查询的承诺来解决,并就行了:

console.log("updateWorker: workerSid is "+workerSid);

workerSid未定义所以有一个碰撞和错误传播回升到主代码中的try / catch块。

基本上,我想要做的是:

  1. 基于workerSid从数据库中获取contact_uri
  2. 使用workerSid更新工人
  3. 一旦更新完成,有关更新的信息输出到控制台

我应该怎么会有我的异步/伺机成立,以确保事件顺序发生的呢?

回答如下:

我重构database.getWorkerSid(),摆脱了无极构造反模式,如下所示:

async getWorkerSid(contact_uri){
        var workerRow=await this.getRowFromWorkerTable(contact_uri);
        if (workerRow.length==0){
            return null;
        }
        else{
            return workerRow[0].sid;
        }
    }

getRowFromWorkerTable(contact_uri){
        return sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
        { type: sequelize.QueryTypes.SELECT});
    }

我宣布我的类方法的所有变量使用var,例如

var workerSid=await database.getWorkerSid(contact_uri);

它现在。

异步/等待正确的顺序不执行功能

我有异步/等待功能的序列,但它们似乎在建议执行并不被阻止由await陈述的顺序来执行。我使用Twilio和Sequelize但我想异步的问题,可诊断无这两种包装的知识。对不起张贴这么多的代码,但我觉得我需要包括所有的它来解释这个问题。

我的主要代码是:

app.post('/sms',async function(req,res){
    try{
        worker=await worker.updateWorker('+18005559999',process.env.TWILIO_OFFLINE_SID);
        responseValue="/sms: worker "+worker.friendlyName+" updated to: "+worker.activityName;
        console.log(responseValue);
        res.status(200).send();

    }
    catch(err){
        console.log("/sms error: "+err);
    }
}

worker.updateWorker()是在ES6类定义如下:

async updateWorker(contact_uri,activitySid){
        console.log("updateWorker: getting workerSid from database");
        workerSid=await database.getWorkerSid(contact_uri);
        console.log("updateWorker: workerSid is "+workerSid);
        worker=await this.updateWorkerFromSid(workerSid,activitySid);
        console.log("updateWorker: worker's friendlyName is "+worker.friendlyName);
        return worker;
    }

database.getWorkerSid()是:

getWorkerSid(contact_uri){
        return new Promise(function(resolve,reject){
            sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
            { type: sequelize.QueryTypes.SELECT})
            .then(result=>{
                if(result.length==0){
                    resolve(null);
                }
                else{
                    resolve(result[0].sid);
                }
            })
            .catch(err=>reject(err));
        });
    }

this.updateWorkerFromSid()是:

async updateWorkerFromSid(workerSid,activitySid){
        var worker;
        try{
            worker=await this.workspace.workers(workerSid)
                        .update({
                            activitySid:activitySid
                        });
            console.log("updateWorkerFromSid: worker has been updated to activity: "+worker.activityName);
            return worker;
        }
        catch(err){
            console.log("updateWorkerFromSid error: "+err);
        }
        finally{
            return worker;
        }

    }

我最终得到的控制台是:

updateWorker: getting workerSid from database
Executing (default): select * from worker where contact_uri='+18005559999'
/sms error: ReferenceError: workerSid is not defined

因此,这让我觉得,我们得到尽可能在sequelize.query()database.getWorkerSid()呼叫,但随后继续执行,而不必等待查询的承诺来解决,并就行了:

console.log("updateWorker: workerSid is "+workerSid);

workerSid未定义所以有一个碰撞和错误传播回升到主代码中的try / catch块。

基本上,我想要做的是:

  1. 基于workerSid从数据库中获取contact_uri
  2. 使用workerSid更新工人
  3. 一旦更新完成,有关更新的信息输出到控制台

我应该怎么会有我的异步/伺机成立,以确保事件顺序发生的呢?

回答如下:

我重构database.getWorkerSid(),摆脱了无极构造反模式,如下所示:

async getWorkerSid(contact_uri){
        var workerRow=await this.getRowFromWorkerTable(contact_uri);
        if (workerRow.length==0){
            return null;
        }
        else{
            return workerRow[0].sid;
        }
    }

getRowFromWorkerTable(contact_uri){
        return sequelize.query("select * from worker where contact_uri='"+contact_uri+"'",
        { type: sequelize.QueryTypes.SELECT});
    }

我宣布我的类方法的所有变量使用var,例如

var workerSid=await database.getWorkerSid(contact_uri);

它现在。

发布评论

评论列表 (0)

  1. 暂无评论