Как синхронно выполнять функции javascript

Я новичок в nodejs. Могут ли некоторые написать мне код sudo, который делает следующее?

Функция1 (); // возвращает массив, который можно использовать в function2 и function3

Функция2 (); // возвращает массив, который можно использовать в function3

Function3 ();

Я хочу запускать все три функции синхронно. Таким образом, function2 должна дождаться завершения функции function1, а затем использовать возвращенный массив в function2. Затем function3 ожидает завершения функции function2, затем использует возвращенный массив в function3 и так далее.

Пробовал что-то вроде этого, но потом, похоже, тоже выполнялся.

function main() {
    return Promise.resolve()
        .then (function(){
            function1()
        })
        .then (function(){
            function2()
        })
        .then (function(){
            function3()
        })
}

Javascript в основном однопоточный. Вы не хотите выполнять их синхронно,, но в сериале.const main = () => function1().then(function2).then(function3), предполагая, что они возвращают обещания.

CertainPerformance 22.05.2018 04:01

Связывание всех этих then() не делает того, что вы хотите, потому что нет return, поэтому все они сразу же сработают. Будет зависеть от того, что вы возвращаете в этих функциях, и от того, как вы получаете эти массивы внутри них.

charlietfl 22.05.2018 04:03

Взгляните на это: stackoverflow.com/a/32718168/9816472

Isaac 22.05.2018 04:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
4 332
5

Ответы 5

Это может помочь вам:

function main() {
return Promise.resolve()
    .then (function(){
        return function1()
    })
    .then (function(results){
        // process your results
        return function2([pass arguments IF required])
    })
    .then (function(results){
        // process your results
        function3([pass arguments IF required])
    })
    .then (function (results) {
        return results
     })
    .catch(function(err) {
        console.info(err)
     })

}

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

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

Начиная с [1,2,3], передаваемого в function2, становится [10,20,30], который передается в function3 и становится [100,200,300].

function asynchFake(data){
  return new Promise((resolve)=>{
      setTimeout(()=> resolve(data),1000)
  })
}

function func1(){
  console.info('func1')
  return asynchFake([1,2,3])
}

function func2(func1Data){
  console.info('func2')
  return asynchFake(func1Data.map(v=>v*10));
}

function func3(func2Data){
  console.info('func3')
  return asynchFake(func2Data.map(v=>v*10))
}

function main() { 
    console.info('main')
    return func1().then(func2).then(func3)
}

main().then(res=>console.info('final results', res))

Что, если я не хочу ждать 1000 мс? Скажем, у меня есть запрос к базе данных в func1, и я хочу дождаться завершения запроса перед выполнением func2.

Nazmul Islam 22.05.2018 04:48

1000 мс - это просто создание поддельной асинхронной операции с визуальной задержкой. Независимо от того, какой db вы используете, он должен иметь методы обещания, и вы могли бы использовать эти обещания вместо того, чтобы возвращаться из функций и разрешать с полученными данными.

charlietfl 22.05.2018 04:50

Вы также можете попробовать async/await, чтобы три функции работали синхронно:

function function1(){
	return [1]
}

function function2(arr){
	return arr.concat([2])
}

function function3(arr){
	return arr.concat([3])
}

async function main(){
	let res = await function1(); // waits for function1 to complete before moving to the next line
	let res2 = await function2(res); // similarly waits for the completion of function2
	let res3 = await function3(res2); // similarly waits for the completion of function3
	console.info(res3)
	console.info("end of main")
}

main()

вот 2 способа достичь того, что вы ищете. Это было немного сложнее, поскольку вы использовали две разные функции, но я думаю, что получил то, что вы ищете.

  • Используйте функцию обратного вызова
  • Используйте эмиттер событий узла

Есть 2 способа достичь того, что вы ищете. Думаю, я получил то, что вы ищете.

Используйте функцию обратного вызова Используйте эмиттер событий узла.

Другие вопросы по теме