如何停止处理表脚本?

时间:2015-05-26 18:01:32

标签: azure azure-mobile-services

我正在创建一个执行某些业务逻辑的插入脚本。

基本上,我想检查一下表格中是否存在插入项目中的值。但是,似乎我发现问题Request.Send()不会停止执行并得到错误。

我认为这里有一个异步问题。我不是100%肯定如何解决。

有没有办法停止执行脚本?

    if (item.memberType === 'Family' && item.primaryFamilyMember) {
    table
        .where({ 
            memberNumber: item.primaryFamilyMember, 
            memberType: 'Family', 
            primaryFamilyMember: null })
        .read({
            success: function(results) {                    
                if (results.length == 0) {
                    request.respond(statusCodes.BAD_REQUEST,
                        'Invalid Primary Family Member specified.');
                    console.error('Invalid Primary Family Member specified:' + item.primaryFamilyMember);
                    validInsert = false;
                } else {
                    item.memberType = results[0].memberType; 
                    item.memberLevel = results[0].memberLevel;
                    item.dateOfExpiry = results[0].dateOfExpiry;                        
                }
            }
        });
}

if (validInsert) {
    var today = new Date();
    var prefix = today.getFullYear().toString().substr(2,2) + ('0' + (today.getMonth() + 1)).slice(-2);

    table.includeTotalCount().where(function(prefix){
                return this.memberNumber.substring(0, 4) === prefix; 
            }, prefix)
            .take(0).read({
        success: function (results) {
            if (isNaN(results.totalCount)) {
                results.totalCount = 0;
            }            
            item.memberNumber = prefix + ('00' + (results.totalCount + 1)).slice(-3);
            request.execute();            
        }
    });
}

是的,validInsert在insert函数的顶部声明。

我假设发生的事情是if(validInsert)在读回调之前运行。但如果是这样,我不知道为什么我会收到“错误:在调用响应后无法调用执行。”这意味着回调首先运行。

此外,即使将400错误发送回客户端,也应该插入记录。

这是一个快递应用吗?我应该在发生错误后调用response.end()吗?

1 个答案:

答案 0 :(得分:1)

是的,该代码肯定存在asyn问题。要解决摆脱validInsert标志并简单地将if (validInsert)部分移动到成功回调中(或使其成为从成功回调中调用的函数)。例如:

success: function(results) {
    if (results.length == 0) {
        request.respond(statusCodes.BAD_REQUEST,
            'Invalid Primary Family Member specified.');
        console.error('Invalid Primary Family Member specified:' + item.primaryFamilyMember);
    } else {
        item.memberType = results[0].memberType;
        item.memberLevel = results[0].memberLevel;
        item.dateOfExpiry = results[0].dateOfExpiry;

        var today = new Date();
        var prefix = today.getFullYear().toString().substr(2,2) + ('0' + (today.getMonth() + 1)).slice(-2);
        ...
        //respond successfully 

    }
}