【发布时间】:2017-12-22 03:02:12
【问题描述】:
我正在研究一种方法,将每个变量的一组 3 个 ajax 调用链接到一组数据,中间有一些延迟。
考虑到this answer.
我正在尝试更新代码以实现以下目标:
在 b() 和 c() 函数中添加延迟
将变量从 a() 传递到 b() 以及从 b() 传递到 c()
有没有一种方法可以使用全局变量将 a() 生成的变量传递给 b() 而不?如果不是这样也没关系,我只是想知道。
在处理 c() 之前,我究竟怎样才能让 b() 延迟几秒钟?我假设添加 setTimeout 会起作用,因为它会在启动 c() 之前等待承诺,但事实并非如此。
function a(user, pass) {
return $.post('/echo/json/', {}, function(re){
console.log(1);
});
}
function b() {
setTimeout(function() {
return $.post('/echo/json/', {}, function(re){
console.log(2);
});
}, 3000);
}
function c() {
console.log(3);
}
var data = [{u: 'au', p: 'ap'}, {u: 'bu', p: 'bp'}];
var counter = 0;
function main() {
if(counter < data.length) {
$.when(a(data[counter].u, data[counter].p).then(b).then(c)).done(function(){
counter++;
main();
})
}
}
main();
【问题讨论】:
-
一,函数b返回未定义
-
@JaromandaX 函数 b 返回一个承诺
-
假设你想等待,你应该在这样的回调中调用be,`.then(res => { b(res).then(r => { c(r). then(finally => { // 一切都完成了 }); });
-
@Matt - 不,它没有 - 函数 b 中没有
return,因此返回值为undefined -
b() 返回 undefined 因为 Javascript 不是一种阻塞语言……这意味着
setTimeout函数会被传递而不管延迟。您只是注册了一些要在超时后执行的代码,但是在调用b()函数之前很久就已经到达了函数的结尾(关闭})。这会导致来自原始调用的void或undefined响应。您可以将b()包装在自定义构建的承诺中,让c()等待setTimeout()
标签: javascript jquery ajax promise