我正在努力掌握javascript承诺的概念。但是我遇到了一些问题。我在本地设置了一个非常小的Web服务(不要生气,Web服务不符合约定)。这里有一些关于它的细节
/login/<username>/<password>
==&gt;登录系统,正确的用户名和密码都是noor
如果用户登录,可以在/car/<brand>/<color>/<plate_number>
,
我没有对颜色,品牌,platenumber的类型进行任何验证
这个很好用,我正在记录并添加一辆车
$.ajax({type: "GET",url: url+"/login/noor/noor"})
.then(function( data, textStatus, jqXHR ) {console.log("login success");},function(){console.log("login error");})
.then($.ajax({type: "GET",url: url+"/car/1/1/1"}))
.then(function(){console.log("car added");},function(){console.log("car not added");});
这个完美地显示错误,因为使用了无效的网址:
$.ajax({type: "GET",url: url+"/carasdsad/1/1/1"})
.then(function(){console.log("car added");},function(){console.log("car not added");});
“/ carasdsad / 1/1/1”是无效的网址,未添加的广告会被退回
我遇到了这个问题。下面的代码使用上面的代码。我期待汽车未添加显示但是显示汽车添加
$.ajax({type: "GET",url: url+"/login/noor/noor"})
.then(function( data, textStatus, jqXHR ) {console.log("login success");},function(){console.log("login error");})
.then($.ajax({type: "GET",url: url+"/carasdsad/1/1/1"}))
.then(function(){console.log("car added");},function(){console.log("car not added");});
以上代码返回已添加汽车,但“/ carasdsad / 1/1/1”是第二次调用中无效的网址。
答案 0 :(得分:4)
根据spec,then
方法忽略了非函数参数。
您的代码简化为最小的案例:
Promise.resolve(true)
.then(Promise.reject("some err"))
.catch(console.log.bind(console, "fail"));
需要以这种方式重写它以捕获错误:
Promise.resolve(true)
.then(function(){ return Promise.reject("some err") })
.catch(console.log.bind(console, "fail"));
答案 1 :(得分:0)
(请使用Chrome / Firefox)
function mPromise(executor) {
this.status = null;
this.result = null;
that=this;
executor(function(result) {
that.status = "fullfiled";
that.result = result;
}, function(result) {
that.status = "rejected";
that.result = result;
})};
mPromise.prototype.then = function(f, r) {
if (this.status == "fullfiled") {
f(this.result);
} else {
r(this.result);
}}
首先,创建一个Promise对象:
var a = new mPromise(function(fFlagFun, rFlagFun) {
setTimeout(function() { //using setTimeout mimic remote request
fFlagFun("yes"); //here you can try rFlagFun("no") by hand;
}, 3000);});
然后 3s后,请执行以下代码段:
a.then(function(e) {console.log(e);}, function(e) {console.log(e);})
如果您以其他形式测试它可能会失败。我希望上面的代码能够概述Promise概念。