让我分享一下我在 Oodles Technologies 工作时学到的东西。让我们举个例子。
假设有四个函数functionCall,doSomeworkOne,doSomeworkTwo,doSomeworkTwo,它们正在执行一些 IO 任务。
函数doSomeworkThree functionCall 依赖doSomeworkOne,doSomeworkOne 依赖doSomeworkTwo,doSomeworkTwo 依赖doSomeworkThree。为了使这些同步,回调函数在所有函数中作为参数传递。
function functionCall(data, callback){
...........
...........
doSomeworkOne(data, callback);
}
function doSomeworkOne(data, callback){
...........
...........
doSomeworkTwo(otherData, callback);
}
function doSomeworkTwo(otherData, callback){
...........
...........
doSomeworkThree(otherData, callback);
}
<span style="font-size:16px;"><span style="font-family:arial,helvetica,sans-serif;"> function doSomeworkThree(otherData, callback){
...........
...........
callback(result);
}
</span></span>
function callback(data){
return data
}
另一方面,回调很好。回调的主要问题是:嵌套在回调内部,嵌套在回调内部。在嵌套回调中,测试/维护代码非常困难。
承诺来了。Promise 为我们提供了一种更简洁、更健壮的异步代码处理方式。而不是使用回调。并且使用 Promise 处理错误也非常容易。
function functionCall(data){
doSomeworkOne(data).then(function(data){
return doSomeworkTwo(data);
}).then(function(data){
return doSomeworkThree(data);
}).catch(function(e) {
// error handle
});
}
function doSomeworkOne(data){
retrun new Promise(function(resolve, reject){
...........
...........
if(error){
reject(error);
}else{
resolve(success);
}
})
}
function doSomeworkTwo(data){
retrun new Promise(function(resolve, reject){
...........
...........
if(error){
reject(error);
}else{
resolve(success);
}
})
}
function doSomeworkThree(data){
retrun new Promise(function(resolve, reject){
...........
...........
if(error){
reject(error);
}else{
resolve(success);
}
})
}
注意: Promise 和 Callbacks 没有根本的不同。在您想要执行一系列操作的嵌套回调中建议使用 Promise。我希望这能帮到您。谢谢。