经典承诺模式可以是(使用Angular的$ q语法):
function myFunction() {
var deferred = $q.defer();
myAsyncCall(
function(result) {
deferred.resolve(result);
},
function(error) {
deferred.reject(error);
}
);
return deferred.promise;
}
myFunction().then(
function(result) {
console.log("Yeah, everything OK ! " + result);
},
function(error) {
console.log("Booh, an error occured ! " + error);
}
);
在调用异步函数之前处理错误导致错误的情况的最佳实践是什么?
示例:
function myFunction(CONDITION) {
var deferred = $q.defer();
if (! CONDITION) {
/***********************
* What to do here ???
***********************/
} else {
myAsyncCall(
function(result) {
deferred.resolve(result);
},
function(error) {
deferred.reject(error);
}
);
}
return deferred.promise;
}
myFunction(CONDITION).then(
function(result) {
console.log("Yeah, everything OK ! " + result);
},
function(error) {
console.log("Booh, an error occured ! " + error);
}
);
我看到了2个解决方案,但没有一个真的很性感:
deferred.reject("condition-is-false")
而不是在条件被拒绝时继续执行异步调用您怎么看?
答案 0 :(得分:1)
您可以直接致电 final EditText editText = new EditText(this){
int prevSelection;
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
if(selStart < 4){
setSelection(prevSelection);
return;
}
prevSelection = selStart;
}
};
,这样做没有问题。到目前为止,这是最好的模式。 E.g:
reject
我已经使用function myFunction(CONDITION) {
return new Promise(function(resolve, reject) {
if (!CONDITION) {
reject('The error message, or something like that');
}
else {
myAsyncCall(function(result) {
resolve(result);
},
function(error) {
reject(error);
});
}
});
}
库创建了一个代码段,因此您可以看到它运行顺畅:
Q
document.addEventListener('DOMContentLoaded', function() {
var div = document.querySelector('div');
function myFunction(CONDITION) {
var deferred = Q.defer();
if (!CONDITION) {
deferred.reject('there was an error');
} else {
myAsyncCall(
function(result) {
deferred.resolve(result);
},
function(error) {
deferred.reject(error);
}
);
}
return deferred.promise;
}
myFunction(false).then(function(res) {
div.innerHTML = res;
}).catch(function(err) {
div.innerHTML = err;
});
});