如何在javascript上进行系列同步调用
How to make a series sync call on javascript
我想在javascript中按顺序进行一系列函数调用。我的情况是,我想上传一些图像到服务器一个接一个,但我不知道如何在javascript中做到这一点。下面是一个解决已知数量函数同步调用的方法。
$('#art1').animate({'width':'1000px'},1000,'linear',function(){
$('#art2').animate({'width':'1000px'},1000,'linear',function(){
$('#art3').animate({'width':'1000px'},1000);
});
});
你可以看到有三个函数链接在一起。如果我一开始就知道函数的个数,它就成立了。但如何实现这一未知的函数数?
用'尚未调用'的方法创建一个数组怎么样?还有一个递归函数,一直运行到数组为空。看一下这个简化的例子:
var calls = [
['func1', ['bar', 'foo']],
['func2', ['hello', 'world']],
['func3', [5]]
];
function func1(a, b) { console.log(b + ' ' + a) }
function func2(a, b) { console.log(a + ' ' + b) }
function func3(a) { console.log(a*a) }
function callInSerial() {
if (calls.length > 0) {
setTimeout(function(){
var call = calls.shift();
window[call[0]].apply(this, call[1]);
callInSerial();
}, 1000);
}
}
callInSerial();
这里最好的方法是利用promise,但我认为为了你自己的学习,可能值得深入研究回调版本。
当你说unknown number of functions时,我假设你可能有一个你想要处理的数组,并且这个数组可以改变。我们还假设您的数组包含有关您希望如何处理每个项的详细信息。例如:
var myArr = [
{ id: '#art1', props: ... },
{ id: '#art2', props: ... }
];
你可以利用它的一种方法是使用递归。有许多实现递归的方法,但这里有一个例子:
function doAnim(arr, complete, index = 0){
if(index >= arr.length){
complete();
}
var item = arr[index];
$(item.id).animate(item.props, function(){
doAnim(arr, complete, index + 1);
});
}
// usage
doAnim(myArr, function(){
console.log('Im done!');
});
这实际上是从自身内部调用相同的函数,更新下一个需要使用的项的数组索引。当条目用完时,它调用传入的total complete函数
相关文章:
- 在控制器和数据对象之间同步数据
- 同步调用,直到用户通过angular验证为访问者
- javascript函数同步
- 动态更改高图中的系列颜色
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- Highcharts colorsByPoint与系列中的线性渐变一起使用时不起作用
- chart.series[id].remove()无法刷新高位图表/高位股票中其他系列的图例属性
- 显示具有服务器端自动时间注销的同步倒计时计时器
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- 音频和动画在javasctipt循环中同步
- 主线程上的同步XMLHttpRequest已弃用
- 主干网.与Safari同步问题
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 是否同步加载了LINK元素
- 异步获取数据使用JavaScript同步获取数据
- 以同步方式获取Javascript Promise的值
- async.js和系列问题
- ajax调用获胜't同步执行
- 我可以同步两个具有不同年份(闰年)的高图表系列吗?
- 如何在javascript上进行系列同步调用