Обратный вызов как num_rows и прерывание, если оператор встречается - PullRequest
3 голосов
/ 13 июля 2020

Мне нужна помощь, у меня есть n данных, которые возвращает ajax запрос клиенту. Каждая строка данных мне нужна для вызова api из другого приложения. Теперь я использую callback для этого, и да, api успешен и дает ценность, как я ожидал. Но у меня небольшая проблема. У меня есть количество ограничений для доступа к api в день, поэтому я хочу, чтобы callback для api отвечал на error_code, например out of quota или любой код ошибки, поэтому для данных следующей строки я не хочу называть снова 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
        }
    }    
    });
});

Я думаю, проблема в том, что он асинхронный. error_code в callback всегда будет undefined/null из этого callback, а break; будет работать, если он находится в скобках for loop (в примере кода, который я показываю, он находится в скобках callback). Извините, если мои объяснения недостаточно ясны. Спасибо

1 Ответ

1 голос
/ 13 июля 2020

Вы можете легко реализовать свои требования, используя Promise.each () библиотеки 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
            });
        }
    }    
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...