используйте then (), чтобы функция выполнялась последовательно в узле - PullRequest
0 голосов
/ 05 декабря 2018

я хочу запустить функцию цикла в шине последовательностей, функция всегда получает асинхронную, есть ли способ сделать ее синхронизированной без использования обратного вызова или какой-либо внешней библиотеки

file 1

var db = require('./promiseUnderStanding');

var fun = function () {
    for (var i = 0; i < 10; i++) {
        db.getFromDb(i, 0);
    }
}
fun();

file2

var mysql = require("mysql");
module.exports = {
 getFromDb : function (num1,num2) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'demo'
    });
    connection.connect();
    connection.query('SELECT '+num1+' + '+num2 +' AS solution', function (error, results, fields) {
        if (error) {
            console.log(err)
        }
        else {
            console.log('The solution is: ', results[0].solution);
        }
    })
    connection.end();
}

}

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Невозможно синхронно выполнить асинхронное обещание.

Однако вы ищете Promise.all().Кроме того, connection.open также является асинхронным, и быстрое открытие и закрытие соединений с MySQL неэффективно.Вы должны открыть соединение перед циклом, выполнить запросы и затем закрыть его (в моем примере это не показано).

Пример

Файл 1:

var db = require('./promiseUnderStanding');

var fun = function () {
    var promises = [];
    for (var i = 0; i < 10; i++) {
        promises.push[db.getFromDb(i, 0)];
    }
    Promise.all(promises).then(function(values){
        console.log(values):
    })
}
fun();

Файл2:

var mysql = require("mysql");
module.exports = {
    getFromDb : function (num1,num2) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'demo'
    });
    var queryPromise = new Promise(function(resolve, reject) {
        connection.connect(function(err){
            connection.query('SELECT '+num1+' + '+num2 +' AS solution', function (error, results, fields) {
                if (error) {
                    reject(error)
                }
                else {
                    resolve(results)
            }
        });
    })})
    connection.end();
    return queryPromise;
    }
}
0 голосов
/ 05 декабря 2018

Ваш вопрос, похоже, касается асинхронных функций, поэтому я рассматриваю логику базы данных как вне области действия.

Использование async-await :

Файл 1:

const fun = async function () {
    for (var i = 0; i < 10; i++) {
        await db.getFromDb(i, 0);
    }
}
fun().then(onFinish).catch(onError);

Файл 2:

module.exports.getFromDb = function() {
    return new Promise((resolve, reject) => {
        // If success
        resolve(result);
        // If fail
        reject(error);
    });
}
  • Функция, которая возвращает Обещание , является асинхронной.
  • Обещание должно быть разрешеноили отклонить.
  • Использовать await внутри асинхронной функции A при вызове асинхронной функции B для ожидания B обещания разрешить или отклонить
  • Если вы используете ключевое слово async для определения функции, ее возвращаемое значение будет заключено в неявное обещание.
0 голосов
/ 05 декабря 2018

Если функция асинхронная, это означает, что она возвращает Обещание.

const myFunc = function(){
    return new Promise(function(resolve, reject){
        if(failed){
            reject(dataSendToCatch);
        }if(!failed){
            resolve(dataSendToThen);
        }
    })
};

Это почти то же самое, что:

const myFunc = async function(){
    if(failed) throw new Error();
        return dataSendToThen;
};

После запуска вашей функции вы можете связать асинхронную иличетные функции синхронизации:

myFunc()
.then(function(dataFromResolve){return otherFunc()})
.then(function(dataFromOtherFunc){/*...*/});

Для непрерывной обработки, фильтрации, сопоставления полученных данных от асинхронных функций хорошо rxjs библиотека.

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