Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在异步函数调用时的Javascript同步流_Javascript_Jquery_Asynchronous_Synchronous - Fatal编程技术网

存在异步函数调用时的Javascript同步流

存在异步函数调用时的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

我花了一整天读关于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() {
    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();
}