JavaScript承诺混乱

时间:2014-03-25 09:48:45

标签: javascript jquery promise

我正在努力掌握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”是第二次调用中无效的网址。

2 个答案:

答案 0 :(得分:4)

根据specthen方法忽略了非函数参数。

您的代码简化为最小的案例:

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)

Promise的简单实现

(请使用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概念。