Javascript 有异步函数调用时的同步流程
Javascript synchronous flow when there are asynchronous function call
我花了一整天阅读 jquery deferred、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() {
A();
B();
C();
print str;
}
预期结果为 123str.
相反,我得到 312 或 213。基本上这 3 个函数不会等待另一个函数结束。我已经尝试使用 .done 和 $.when(a).then(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 setAuthor() {
author = sessionStorage.getItem('LoggedUser');
console.log("2");
}
然后
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();
}
这里是 firebug 控制台。
http://i.imgur.com/zQ0Mk4E.jpg
因为你没有post你所说的你用Promises试过的任何东西,下面是它的工作原理..
function A() {
return new Promise(function(done) {
// emulate async call with setTimeout
setTimeout(function() {
console.log("1");
done();
}, 100);
});
}
function B() {
return new Promise(function(done) {
// "normal" code
console.log("2");
done();
});
}
function C() {
return new Promise(function(done) {
// emulate async call with setTimeout
setTimeout(function() {
console.log("3");
done();
}, 100);
});
}
function xyz() {
A()
.then(B)
.then(C)
.then(function() {
// whatever this is supposed to be
//print str;
// maybe you meant..
console.log('str');
});
}
xyz();
return
jQuery promise 对象的 Promise
来自函数。使用 .then()
链接 return 承诺对象的承诺或函数。
function A() {
return $.Deferred(function(dfd) {
setTimeout(function() {
dfd.resolve("1")
}, Math.floor(Math.random() * 2500))
})
.then(function(result) {
console.log(result);
return result
});
}
function B() {
var value = "2";
console.log(value);
return value
}
function C() {
return $.Deferred(function(dfd) {
setTimeout(function() {
dfd.resolve("3")
}, Math.floor(Math.random() * 2500))
})
.then(function(result) {
console.log(result);
return result
});
}
function xyz(results) {
return A()
.then(function(data) {
results.push(data);
return B()
})
.then(function(data) {
var value = "3";
results.push(data);
return C()
})
.then(function(data) {
var value = "str";
results.push(data, value);
console.log(value);
return results
})
}
xyz([])
.then(function(results) {
console.log("complete:", results);
})
.fail(function(err) {
console.log(err);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
$(".button").click(function(){
a(function(){
b(function(){
c(function(){
d(function(){
});
});
});
});
});
function a(callback){
console.log("1");
callback();
}
function b(callback){
console.log("2");
callback();
}
function c(callback){
console.log("3");
callback();
}
function d(callback){
console.log("4");
callback();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<button class="button" >ClickToCall</button>
您可能需要尝试使用所有功能进行回调。
当我们需要管理这类流程时。我总是使用回调来管理完整的过程。在函数 a、b、c、d 中,您可以调用 ajax,如果 ajax 成功,您需要传递 callback() 函数。
如果您需要有关此的更多信息,请告诉我
在 Chrome 和 Firefox Developer Edition 中,您现在可以使用 async
/await
。直截了当:
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
async function A() {
await wait(100);
console.log("1");
}
function B() {
console.log("2");
}
async function C() {
await wait(100);
console.log("3");
}
async function xyz() {
await A();
B();
await C();
console.log("Done.");
}
xyz();
还在用promises,只是你看不出来。
我花了一整天阅读 jquery deferred、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() {
A();
B();
C();
print str;
}
预期结果为 123str.
相反,我得到 312 或 213。基本上这 3 个函数不会等待另一个函数结束。我已经尝试使用 .done 和 $.when(a).then(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 setAuthor() {
author = sessionStorage.getItem('LoggedUser');
console.log("2");
}
然后
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();
}
这里是 firebug 控制台。 http://i.imgur.com/zQ0Mk4E.jpg
因为你没有post你所说的你用Promises试过的任何东西,下面是它的工作原理..
function A() {
return new Promise(function(done) {
// emulate async call with setTimeout
setTimeout(function() {
console.log("1");
done();
}, 100);
});
}
function B() {
return new Promise(function(done) {
// "normal" code
console.log("2");
done();
});
}
function C() {
return new Promise(function(done) {
// emulate async call with setTimeout
setTimeout(function() {
console.log("3");
done();
}, 100);
});
}
function xyz() {
A()
.then(B)
.then(C)
.then(function() {
// whatever this is supposed to be
//print str;
// maybe you meant..
console.log('str');
});
}
xyz();
return
jQuery promise 对象的 Promise
来自函数。使用 .then()
链接 return 承诺对象的承诺或函数。
function A() {
return $.Deferred(function(dfd) {
setTimeout(function() {
dfd.resolve("1")
}, Math.floor(Math.random() * 2500))
})
.then(function(result) {
console.log(result);
return result
});
}
function B() {
var value = "2";
console.log(value);
return value
}
function C() {
return $.Deferred(function(dfd) {
setTimeout(function() {
dfd.resolve("3")
}, Math.floor(Math.random() * 2500))
})
.then(function(result) {
console.log(result);
return result
});
}
function xyz(results) {
return A()
.then(function(data) {
results.push(data);
return B()
})
.then(function(data) {
var value = "3";
results.push(data);
return C()
})
.then(function(data) {
var value = "str";
results.push(data, value);
console.log(value);
return results
})
}
xyz([])
.then(function(results) {
console.log("complete:", results);
})
.fail(function(err) {
console.log(err);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
$(".button").click(function(){
a(function(){
b(function(){
c(function(){
d(function(){
});
});
});
});
});
function a(callback){
console.log("1");
callback();
}
function b(callback){
console.log("2");
callback();
}
function c(callback){
console.log("3");
callback();
}
function d(callback){
console.log("4");
callback();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<button class="button" >ClickToCall</button>
您可能需要尝试使用所有功能进行回调。 当我们需要管理这类流程时。我总是使用回调来管理完整的过程。在函数 a、b、c、d 中,您可以调用 ajax,如果 ajax 成功,您需要传递 callback() 函数。
如果您需要有关此的更多信息,请告诉我
在 Chrome 和 Firefox Developer Edition 中,您现在可以使用 async
/await
。直截了当:
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
async function A() {
await wait(100);
console.log("1");
}
function B() {
console.log("2");
}
async function C() {
await wait(100);
console.log("3");
}
async function xyz() {
await A();
B();
await C();
console.log("Done.");
}
xyz();
还在用promises,只是你看不出来。