我通读了各种线程,比如这个线程。
但我真的不知道如何完成以下任务:
我有4个函数,希望它们依次发生。请注意,它们的顺序不正确,以便于理解我的观点。我想要输出"1,2,3,4'"的结果
function firstFunction(){
// some very time consuming asynchronous code...
console.log('1');
}
function thirdFunction(){
// definitely dont wanna do this until secondFunction is finished
console.log('3');
}
function secondFunction(){
// waits for firstFunction to be completed
console.log('2');
}
function fourthFunction(){
// last function, not executed until the other 3 are done.
console.log('4');
}
我试着找出回电话,但迷路了:(
难道没有简单的方法吗?就像在数组中循环一样。。。
这是开始使用jQuery Deferred的绝佳机会。
除了基于回调的解决方案外,代码可读、灵活且高度可维护
http://jsfiddle.net/zerkms/zJhph/
function firstFunction(){
var d = $.Deferred();
// some very time consuming asynchronous code...
setTimeout(function() {
console.log('1');
d.resolve();
}, 1000);
return d.promise();
}
function thirdFunction(){
var d = $.Deferred();
// definitely dont wanna do this until secondFunction is finished
setTimeout(function() {
console.log('3');
d.resolve();
}, 1000);
return d.promise();
}
function secondFunction(){
var d = $.Deferred();
setTimeout(function() {
console.log('2');
d.resolve();
}, 1000);
return d.promise();
}
function fourthFunction(){
var d = $.Deferred();
// last function, not executed until the other 3 are done.
setTimeout(function() {
console.log('4');
d.resolve();
}, 1000);
return d.promise();
}
firstFunction().pipe(secondFunction).pipe(thirdFunction).pipe(fourthFunction);
PS:作为异步代码的一个例子,我使用了setTimeout
。最重要的是,在异步部分的末尾,您需要调用d.resolve()
来继续链接方法。
我们的想法是,您可以执行以下操作,这样,一旦第一个函数运行完毕,它就会知道要运行什么,而不是您必须在函数之外自己计算:
function firstFunction(callback){
// some very time consuming asynchronous code...
console.log('1');
return callback(function(){
alert("Second function finished.");
return true;
});
}
function secondFunction(callback){
// waits for firstFunction to be completed
console.log('2');
return callback();
}
firstFunction(secondFunction);
同时查找.apply()
和.call()
。
如果我使用回调,我的工作解决方案现在看起来是这样的:
one(two);
function one(callb){
console.log('1');
callb(three);
}
function four(){
console.log('4');
}
function two(callb){
console.log('2');
callb(four);
}
function three(callb){
console.log('3');
callb();
}
我觉得那太可怕了。如果有超过2-3个序列,我应该如何跟踪这些东西?颤抖
过了一段时间,我在jquery文档中注意到了deferreds
的一些内容,特别是when
核心API函数。
$.when( $.ajax("test.aspx") ).then(function(ajaxArgs){
alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */
});
代码示例取自http://jqapi.com/#p=jQuery.when
我玩过Promise、Sequence、Exception、Callback来了解它是如何工作的,并最终编写了这段代码。
使用回调调用函数,并将结果作为参数按顺序发送给另一个函数,并出现catch错误。
function firstFunction(par) {
return new Promise(function (resolve, reject) {
console.log("start " + par);
setTimeout(function (par) {
console.log(par);
resolve(par + 1);
}, 1000, par);
});
}
function secondFunction(par) {
return new Promise(function (resolve, reject) {
console.log("start " + par);
setTimeout(function (par) {
console.log(par);
try{
throw "Let's make an error...";
}
catch(err)
{
reject(err);
}
resolve(par + 1);
}, 1000, par);
})
}
function thirdFunction(par) {
return new Promise(function (resolve, reject) {
console.log("start " + par);
setTimeout(function (par) {
console.log(par);
resolve(par + 1);
}, 1000, par);
});
}
function CatchError(error) {
console.log("Exception: " + error);
}
//Break all chain in second function
function ChainBrake() {
firstFunction(1)
.then(secondFunction)
.then(thirdFunction)
.catch(CatchError);
}
//Log error and continue executing chain
function ChainContinue() {
firstFunction(1)
.catch(CatchError)
.then(secondFunction)
.catch(CatchError)
.then(thirdFunction)
.catch(CatchError);
}