Я новичок в 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()
})
}Связывание всех этих then() не делает того, что вы хотите, потому что нет return, поэтому все они сразу же сработают. Будет зависеть от того, что вы возвращаете в этих функциях, и от того, как вы получаете эти массивы внутри них.
Взгляните на это: stackoverflow.com/a/32718168/9816472



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это может помочь вам:
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.
1000 мс - это просто создание поддельной асинхронной операции с визуальной задержкой. Независимо от того, какой db вы используете, он должен иметь методы обещания, и вы могли бы использовать эти обещания вместо того, чтобы возвращаться из функций и разрешать с полученными данными.
Вы также можете попробовать 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 способа достичь того, что вы ищете. Думаю, я получил то, что вы ищете.
Используйте функцию обратного вызова Используйте эмиттер событий узла.
Javascript в основном однопоточный. Вы не хотите выполнять их синхронно,, но в сериале.
const main = () => function1().then(function2).then(function3), предполагая, что они возвращают обещания.