存在异步函数调用时的Javascript同步流
我花了一整天读关于jquery、promise等的书 我的问题很简单 我有一个函数调用其他4个函数,其中一些函数具有异步调用以从服务器获取数据存在异步函数调用时的Javascript同步流,javascript,jquery,asynchronous,synchronous,Javascript,Jquery,Asynchronous,Synchronous,我花了一整天读关于jquery、promise等的书 我的问题很简单 我有一个函数调用其他4个函数,其中一些函数具有异步调用以从服务器获取数据 function A() { async call console.log("1"); } function B() { normal code console.log("2"); } function C() { async call console.log("3"); } function xyz
function A() {
async call
console.log("1");
}
function B() {
normal code
console.log("2");
}
function C() {
async call
console.log("3");
}
function xyz() {
A();
B();
C();
print str;
}
预期结果为123str
相反,我得到312或213。基本上,这三个函数不会等待另一个函数的结束。我已经试过了。完成了。当(a)。然后(b),承诺
但什么都不管用。有人能给我一个简单有效的示例代码吗
编辑:
function setId() {
var doc = sessionStorage.getItem("urlDoc");
var user = sessionStorage.getItem("LoggedUser");
var string = "urlDoc=" + doc + "&user=" + user;
if (sessionStorage.getItem("countId") === null) {
$.ajax({
type: 'POST',
url: 'php/findTemporaryId.php',
data: string,
success: function (data) {
sessionStorage.setItem("countId", data);
countId = sessionStorage.getItem("countId");
id = countId;
console.log("1");
},
error: function () {
alert("Server Error");
}
});
} else {
sessionStorage.setItem("countId", parseInt(sessionStorage.getItem("countId")) + 1);
countId = sessionStorage.getItem("countId");
id = countId;
console.log("1");
}
然后
然后
我就是这样称呼他们的
function saveSelectionFragment() {
setId();
setAuthor();
getData();
}
这里是firebug控制台。
既然你没有发布任何你说你尝试过的东西,下面是它的工作原理
函数A(){
返回新承诺(功能(完成){
//使用setTimeout模拟异步调用
setTimeout(函数(){
控制台日志(“1”);
完成();
}, 100);
});
}
函数B(){
返回新承诺(功能(完成){
//“正常”代码
控制台日志(“2”);
完成();
});
}
函数C(){
返回新承诺(功能(完成){
//使用setTimeout模拟异步调用
setTimeout(函数(){
控制台日志(“3”);
完成();
}, 100);
});
}
函数xyz(){
()
.然后(B)
.然后(C)
.然后(函数(){
//不管这是什么
//打印str;
//也许你的意思是。。
console.log('str');
});
}
xyz()
从函数返回jQuery Promise对象的Promise
。使用.then()
链接返回承诺对象的承诺或函数
函数A(){
返回延迟的美元(函数(dfd){
setTimeout(函数(){
dfd.决议(“1”)
},Math.floor(Math.random()*2500))
})
.然后(函数(结果){
控制台日志(结果);
返回结果
});
}
函数B(){
var value=“2”;
console.log(值);
返回值
}
函数C(){
返回延迟的美元(函数(dfd){
setTimeout(函数(){
dfd.决议(“3”)
},Math.floor(Math.random()*2500))
})
.然后(函数(结果){
控制台日志(结果);
返回结果
});
}
函数xyz(结果){
返回一个()
.then(功能(数据){
结果:推送(数据);
返回B()
})
.then(功能(数据){
var value=“3”;
结果:推送(数据);
返回C()
})
.then(功能(数据){
var value=“str”;
结果:推送(数据、值);
console.log(值);
返回结果
})
}
xyz([]))
.然后(函数(结果){
控制台日志(“完成:”,结果);
})
.失败(功能(错误){
控制台日志(err);
})
$(“.button”)。单击(函数(){
a(函数(){
b(职能({
c(职能({
d(功能(){
});
});
});
});
});
函数a(回调){
控制台日志(“1”);
回调();
}
函数b(回调){
控制台日志(“2”);
回调();
}
函数c(回调){
控制台日志(“3”);
回调();
}
函数d(回调){
控制台日志(“4”);
回调();
}
在Chrome和Firefox开发者版中单击调用,您现在可以使用。直截了当地说:
var wait=ms=>newpromise(resolve=>setTimeout(resolve,ms));
异步函数A(){
等待等待(100);
控制台日志(“1”);
}
函数B(){
控制台日志(“2”);
}
异步函数C(){
等待等待(100);
控制台日志(“3”);
}
异步函数xyz(){
等待一个();
B();
等待C();
console.log(“完成”);
}
xyz()代码>将异步调用和普通代码发布到您调用A()并立即调用B()。A需要有一个回调或返回一个承诺,一旦该承诺被填满(或调用回调),您需要调用B,然后调用C(与A相同)相同的伪代码:A()。然后(function(){B();return C();})。然后(function(){print str;})代码>。假设A
和C
返回承诺。
function getData() {
$.ajax({
type: 'POST',
url: 'php/date.php',
success: function (data) {
date = data;
console.log("3");
},
error: function () {
alert("Error");
}
});
}
function saveSelectionFragment() {
setId();
setAuthor();
getData();
}