Javascript 回调为num_行,如果语句满足则中断

Javascript 回调为num_行,如果语句满足则中断,javascript,jquery,Javascript,Jquery,我需要帮助,我有n个数据,其中由ajax请求返回给客户端。我需要从其他应用程序调用api的每一行数据。现在我使用回调来实现这一点,是的,api是成功的,正如我所期望的那样提供了价值。但我有点小问题。我每天访问api有很多限制,所以我想要的是,如果api的回调正在响应一些错误代码,比如超出配额或任何错误代码,那么对于下一行数据,我不想再次调用api。我的代码如下所示: $("#verifyMe").submit(function(event) { var isError

我需要帮助,我有n个数据,其中由ajax请求返回给客户端。我需要从其他应用程序调用api的每一行数据。现在我使用回调来实现这一点,是的,api是成功的,正如我所期望的那样提供了价值。但我有点小问题。我每天访问api有很多限制,所以我想要的是,如果api的回调正在响应一些错误代码,比如超出配额或任何错误代码,那么对于下一行数据,我不想再次调用api。我的代码如下所示:

$("#verifyMe").submit(function(event) {
    var isError = false;
    var formDatas = new FormData($('#verifyMe')[0]);
    // getting my row Data (SELECT * FROM table)
    $.ajax({
    ....
    success: function(kis) {
        for (var i = 0; i < kis.data.length; i++) { // loop as many row data
            // call api as long as no break
            console.log(isError); // always be false
            checking(kis.data[i].id, function(output){ // api returning object
                if(output.error_code) {
                    console.log(isError); // last value
                    isError = true; // only affect in callback bracket
                    console.log(isError); // true
                    break; // break for loop calling the api
                }
            } // end of callback bracket
            // I think the break; should goes this line but error_code will undefined bc out of callback function
        }
    }    
    });
});

我认为问题在于异步。回调中的错误代码将始终未定义/空出该回调,并中断;在示例代码中,如果它位于for循环括号内,则将起作用。我将显示它位于回调括号内。对不起,我的解释不够清楚。谢谢

您可以使用bluebird库轻松实现您的需求。 使用此函数,可以按顺序执行异步函数

var Promise = require('bluebird');
...
$.ajax({
    ....
    success: function(kis) {
            Promise.each(kis.data, (oneData) => {
                return new Promise((resolve, reject) => {
                    // It will be performed sequentially
                    checking(oneData.id, function(output){ // api returning object
                        if(output.error_code) {
                            reject(output.error_code); // break for loop calling the api
                        }
                        // Success case
                        resolve();
                    });
                });
            })
            .then(result => {
                // Will be called when all kis.data have been successfully processed
            })
            .catch(error => {
                // Will be called when an error occurs in the kid.data
            });
        }
    }    
});


您可以尝试在名为isError=false的循环之前声明一个变量;如果出现错误,则设置为true。然后在每次API调用之前检查它是否为真,然后中断。在这种情况下,使用returnfalse;而不是休息@我已经试过了。你的意思是如果我得到错误,那么isError=true,对吗?是的,但若错误在回调中,那个么错误值只影响回调括号中的值。在那里,isError总是错误的。我编辑了上面的示例代码。@msc我也尝试过返回false;在回调中,但停下来循环没有效果我很感激,伙计。这似乎是个好办法。您能提供练习拒绝和解决的链接吗?@far1023有关承诺的基本用法,请参阅。