如何确保在所有其他功能之后调用函数

时间:2017-03-27 09:13:47

标签: javascript jquery ajax

我有4-5个JavaScript函数调用ajax并在一段时间后响应,但是例如我给出了没有ajax代码的3个函数的例子。

在此,我想确保func3会在另外两个函数func1func2之后调用。

func3();
func1();
func2();


function func1(){
  setTimeout(function(){ 
    console.log("func1");
  }, 2000);
}
function func2(){
  setTimeout(function(){ 
    console.log("func2");
  }, 3000);
}
function func3(){
  setTimeout(function(){ 
    console.log("func3");
  }, 1000);
}

我希望总时间为4秒。 func1func2将在3秒内同时运行,然后在1秒内运行func3

4 个答案:

答案 0 :(得分:2)

在func结束前调用它们?



func3();


function func1(){
    console.log("func1");
    func2();
}
function func2(){
    console.log("func2");
}
function func3(){
    console.log("func3");
    func1();
}




修改1:



func1();


function func1(){
  setTimeout(function(){ 
    console.log("func1");
    func2();
  }, 1500);
}
function func2(){
  setTimeout(function(){ 
    console.log("func2");
    func3();
  }, 1500);
}
function func3(){
  setTimeout(function(){ 
    console.log("func3");
  }, 1000);
}




答案 1 :(得分:0)

let promises = [];
let ajaxCall = new Promise((resolve, reject) => {
  console.log('ajaxCall');
  setTimeout(() => {
    resolve();
  },1000);
});

let fn1 = new Promise((resolve, reject) => {
  console.log('fn1');
  ajaxCall.then(() => {
    resolve();
  });
});

let fn2 = new Promise((resolve, reject) => {
  console.log('fn2');
  ajaxCall.then(() => {
    resolve();
  });
});

promises.push(fn1); 
promises.push(fn2);

Promise.all((promises)).then(() => {
  console.log('fn3');
});

希望这有帮助

答案 2 :(得分:0)

只是对Promises的快速入门:

承诺是一个基本上说的对象,"这项工作还没有完成,但我会告诉你它什么时候。"

创建Promise时,可以使用.then()附加回调函数。当承诺解决 - 也就是说,它的工作已经完成 - 所有的回调都将被执行。您还可以使用.fail()或类似内容附加回调,如果承诺被拒绝,则会执行这些回调。

在您的情况下,您可能会执行以下操作:

func1().then(func2).then(func3);

function func1(){
    var p = new Promise();
    setTimeout(function(){ 
        console.log("func1");
        p.resolve();
    }, 2000);
    return p;
}
function func2(){
    var p = new Promise();
    setTimeout(function(){ 
        console.log("func2");
        p.resolve();
    }, 3000);
    return p;
}
function func3(){
    var p = new Promise();
    setTimeout(function(){ 
        console.log("func3");
        p.resolve();
    }, 1000);
    return p;
}

此外,大多数Promise库都有.whenAll()类型函数。这需要多个Promise并在所有promise完成后调用其.then()回调。所以你可以这样做:

whenAll(func1(), func2()).then(func3);

如果您所处的环境中可以使用EcmaScript6,则会有一个内置的Promise库。请阅读this MDN article以获取有关该库的信息。

否则,我强烈推荐jQuery's promise library。

注意:上面的代码只是伪代码。阅读文档,了解如何在这些框架中实际实现Promises。

答案 3 :(得分:0)

我按照我的意愿制作了这样的照片。但是我不知道它的不良做法,我不知道承诺并得到一些答案,但那些没有用。

class InspectTheSystemTableVC: UITableViewController {

//MARK: - Properties

private var managedObjectContext: NSManagedObjectContext!

private var storedFloors = [Floors]()

private var storedRooms = [Rooms]()

private var storedAlarms = [Alarms]()

//MARK: - Actions

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    loadFloorData()


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

private func loadFloorData() {
    let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
    let roomsRequest: NSFetchRequest<Rooms> = Rooms.fetchRequest()
    let alarmRequest: NSFetchRequest<Alarms> = Alarms.fetchRequest()

    floorRequest.returnsObjectsAsFaults = false
    roomsRequest.returnsObjectsAsFaults = false
    alarmRequest.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(floorRequest)
        storedRooms = try managedObjectContext.fetch(roomsRequest)
        storedAlarms = try managedObjectContext.fetch(alarmRequest)
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")
    }
}


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "system cell", for: indexPath) as! SystemCell

    return cell
}

注意:第一个函数start = 0; func1(); func2(); function func1(){ setTimeout(function(){ console.log("func1"); start++; if(start==2){ func3(); } }, 2000); } function func2(){ setTimeout(function(){ console.log("func2"); start++; if(start==2){ func3(); } }, 3000); } function func3(){ setTimeout(function(){ console.log("func3"); }, 1000); }func1秒内2打印func2秒,因为1已经消失,然后2在{ {1}}第二次总func3秒欢呼:)

相关问题