該方法的後半部分是否需要提供給getThingTheSlowWay()
的回調?
是的,正好。對於異步結果,您無法執行thang =
。你的函數將基本上是這樣的:
function getThing(callback) {
var thang = getThingTheFastWay();
if (thang) {
if (!thang.validate())
callback(new Error('invalid thang'));
else
callback(null, thang);
} else {
getThingTheSlowWay(function(err, thang) {
if (!err && !thang.validate())
callback(new Error('invalid thang'));
else
callback(err, thang);
});
}
}
爲了避免重複,你會使用命名函數:
function getThing(callback) {
function validateThang(err, thang) {
if (!err && !thang.validate())
callback(new Error('invalid thang'));
else
callback(err, thang);
}
var thang = getThingTheFastWay();
if (thang)
validateThang(null, thang);
else
getThingTheSlowWay(validateThang);
}
另一種方法是使用的承諾。假設getThingTheSlowWay
返回一個承諾,而getThingTheFastWay
沒有,它看起來像
function getThing() {
return Promise.resolve(getThingTheFastWay() || getThingTheSlowWay())
.then(function validateThang(thang) {
if (thang.validate())
return thang;
else
throw new Error('invalid thang');
});
}
如何確定快速路徑是否可用?由於node.js是異步的,所以'thang'可能總是未定義,具體取決於getThingTheFastWay()執行的時間。 –