我有4-5个JavaScript函数调用ajax并在一段时间后响应,但是例如我给出了没有ajax代码的3个函数的例子。
在此,我想确保func3
会在另外两个函数func1
和func2
之后调用。
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秒。 func1
和func2
将在3秒内同时运行,然后在1秒内运行func3
。
答案 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
秒欢呼:)