我正在研究一种方法,将每个变量的3个ajax调用链接到一个数据数组,并在它们之间有一些延迟。
我正在尝试更新代码以实现以下目标:
在b()和c()函数中添加延迟
将变量从()传递给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();
答案 0 :(得分:1)
要确保在调用超时代码之后才执行c()
,请创建自己的承诺并从b()
函数返回它。您应该将setTimeout
函数包装在此承诺中,并调用resolve(res)
方法通知.then()
函数观察承诺,传递表示data
或{{1}的对象响应。
body
请注意,function b(dataFromA) {
return new Promise((resolve, reject) => {
setTimeout(function() {
return $.post('/echo/json/', {}, res => {
let dataToB = res;
console.log(2);
resolve(dataToB);
});
}, 3000);
});
}
现在接受可以从b()
承诺的响应传递的数据。在调用a()
之前,您可以在b(res)
函数或promiseFromA.then(res => { // ... Your promise callback code });
中操作此数据。
答案 1 :(得分:0)
函数b中使用的setTimeout不是一个promise。我会找到一些文档到网站并发布不久,但这是我所看到的。
使用你需要调用promise方法的promise,setTimeout不是promise。这只是一个延迟。它与javascript或javascript运行时中的事件循环有关,更加正确。这里有一些好东西 - &gt; https://github.com/getify/You-Dont-Know-JS/tree/master/async%20%26%20performance
也。仅用于解决承诺
getify真的打破了它,但我会从javascript事件循环开始