簡體   English   中英

Node.js如何同步執行以下功能

[英]Node.js How to excecute the below function synchronously

我想在不更改時間的情況下同步執行以下功能,輸出將是123.如何使用node.js

function f1(){
  setTimeout(function() {
    console.log('Hi I am order 1');
  }, 3000);
}

function f2() {
  setTimeout(function() {
    console.log('Hi I am order 2');
  }, 2000);
}

function f3() {
  setTimeout(function() {
    console.log('Hi I am order 3');
  }, 1000);
}

f3();
f2();
f1();

由於函數調用順序,您的問題似乎不正確。 看來您想先調用f1()?

在2018年,您可以將ES6與async / await一起使用:

 let delay = (time) => new Promise((resolve) => setTimeout(resolve, time)) async function f1(){ await delay(3000) console.log('Hi I am order 1') } async function f2() { await delay(2000) console.log('Hi I am order 2') } async function f3() { await delay(1000) console.log('Hi I am order 3'); } void async function run () { // It can be runned one-by-one await f1() await f2() await f3() // Or it can be runned in parallel // And then you lost ordering // await Promise.all([f3(), f2(), f1()]) } () 

一點代碼重構

function f1(){
    console.log('Hi I am order 1');
}

function f2() {
    console.log('Hi I am order 2');
}

function f3() {
    console.log('Hi I am order 3');
}

function delay(func, interval) {
    return new Promise(resolve => {
        setTimeout(() => {
            func();
            resolve();
        }, interval)
    })
}

(async () => {
    await delay(f1, 3000);
    await delay(f2, 2000);
    await delay(f3, 1000);
})();
  • 函數f1f2f3應該只關注其功能
  • 使用delay包裝器延遲執行
  • 使用await來確保同步執行

JavaScript Promises是同步不同功能的更好方法,但是更簡單(盡管更難維護)的方法是在每個函數中添加一個參數,以執行下一步需要調用的任何函數。

function f1(func) { setTimeout(function() { console.log('Hi I am order 1'); func(); }, 3000); }

function f2(func) { setTimeout(function() { console.log('Hi I am order 2'); func(); }, 2000); }

function f3(func) { setTimeout(function() { console.log('Hi I am order 3'); func(); }, 1000); }

f1(f2(f3)));

另一種方法是像這樣使用setTimeout函數本身:

function f1() { setTimeout(function() { console.log('Hi I am order 1'); f2(); }, 3000); }

function f2() { setTimeout(function() { console.log('Hi I am order 2'); f3(); }, 2000); }

function f3() { setTimeout(function() { console.log('Hi I am order 3'); }, 1000); }

f1();

但是,如果要執行任意嵌套,則此方法的靈活性較差。

編輯:修復了我的第一個示例中的一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM