讓我分享我在Oodles Technologies工作的經驗。我們舉一個例子。
讓有四個功能functionCall,doSomeworkOne,doSomeworkTwo,doSomeworkTwo,他們正在執行一些IO任務。
函數doSomeworkThree函數調用取決於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
}
回調,而另一方面是好的。回調的主要問題是:嵌套在回調中,嵌套在回調中。在嵌套回調中,測試/維護代碼非常困難。
這裏的承諾來。 Promises爲我們提供了一種更簡潔更強大的處理異步代碼的方法。而不是使用回調。承諾處理錯誤也很容易。
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是明智的。 我希望這會幫助你。 謝謝。
也許你只是在試驗,但是你寫的函數不是異步的,所以你可以返回結果。如果函數本身調用其他異步方法,則只需使用回調方法。 – JohnnyHK