Javascript 如何回报你的承诺呢

Javascript 如何回报你的承诺呢,javascript,angularjs,promise,q,deferred,Javascript,Angularjs,Promise,Q,Deferred,我希望能够连锁承诺,以使代码同步。我的问题是,根据第一个$http请求的结果,我可能想发送另一个,也可能不想发送。 如果我选择不发送另一个$http请求,我不需要第二个then()来执行任何操作。但是,由于我的第二个then()不知道所有这些,而且它一直挂在那里,所以我想我需要从第一个返回,然后是一些虚假的承诺。但我也希望在第二个例子中认识到这一点()。我想到了从第一个案例中返回$q.when('somevalue')。代码如下: $http.get(url, params) .then

我希望能够连锁承诺,以使代码同步。我的问题是,根据第一个$http请求的结果,我可能想发送另一个,也可能不想发送。 如果我选择不发送另一个$http请求,我不需要第二个
then()
来执行任何操作。但是,由于我的第二个
then()
不知道所有这些,而且它一直挂在那里,所以我想我需要从第一个返回,然后是一些虚假的承诺。但我也希望在第二个例子中认识到这一点()。我想到了从第一个案例中返回$q.when('somevalue')。代码如下:

$http.get(url, params)
    .then(function(res) {
        res = res.data;
        if (res.status == 'ok' && res.rows.length > 0) {
            $scope.roomTypes = res.rows;
            return $q.when({ isDummy: true }); //in this case I don't need to send another request
        } else if (res.rows.length === 0 && $scope.request.roomType) {
            return $http.get(url2, params2); //make second request and return then`able promise
        }
    }, function(res) {
        throw 'Error';
    })
    .then(function(res) {
        res = res.data;
        if (res.status == 'ok') {
            var roomType = {
                room_type: res.roomType.id,
                description: res.roomType.description
            };
            $scope.roomTypes.push(roomType);
        } else if (res.isDummy) {
            //ok that's our dummy promise 
        } else {
            //format of response unexpected it means something went wrong
            throw "error";
        }
    }, funcrtion(res) {
        throw "some Error";
    })
    .catch(function(res) {...})
    .finally(function() {...});

问题是我想看到承诺被解决的价值({isDummy:true}),但我该怎么做呢?我在
res
参数中得到
未定义的

res
将在此处未定义

      .then(function(res) {
        res = res.data;
        ...

因为
{isDummy:true}
对象上没有
数据
属性。

尝试返回除promise或deferred:)之外的任何对象,其值将传递给
,然后
。像这样:

return { isDummy: true };
示例代码:

从jQuery
时:

如果将单个参数传递给jQuery.when(),并且它不是延迟或承诺,则它将被视为已解析的延迟,并且将立即执行任何附加的doneCallbacks。doneCallbacks被传递给原始参数


如果您想要代码同步,您总是可以先写一个长代码块,然后再写

如果您想连锁承诺(Post:url1)->(Post:url2)等等:

1.退货没有用。 2.假设您有2个想要链接的$http承诺,这两个承诺都来自一个名为$users的服务,它们分别名为GetUserAge和GetRelevantBars,第二个查询基于第一个查询的结果

angular
 .module("moduleA")
 .controller("exmapleCtrl",exampleCtrl);

exampleCtrl.$injector=["$users"];

function exampleCtrl($users){
 var vm=this;

 vm.query = $users.GetUserAge().then( /*OnSuccess*/ GetUserAgeCB)

 //Callback of the GetUserAgeCB;
 function GetUserAgeCB(result){
  $users.GetRelevantBars().then( /*OnSuccess*/ GetRelevantBarsCB);
  /*continuation of CallBack code*/
 }


 //Callback of the GetRelevantBarsCB;
 function GetRelevantBarsCB(result){
  /*CallBack code*/
 }

}

希望这是可以理解的。

我认为这里的基本问题是混淆承诺和承诺处理者。成功处理程序应该返回一个值,而不是另一个承诺。当您在promise成功处理程序中时,promise机制会将您返回的值“包装”到下一个处理程序中。这意味着你的第二个承诺没有看到最初的回应,而是第一个承诺返回了什么

除非您按原样传递,否则该值将按原样处理

比如说 这都是你的底线

return $q.when({isDummy: true});
应该是

return {isDummy: true};
问题是另一种情况,您希望继续进行下一个查询。我可能会执行以下操作之一: 1.从第一个处理程序开始(使用第一个处理程序的相关逻辑)。 2.传递url2和params-return({url:url2,params:params}),并在第二个承诺中处理它们


注意,Chanin甚至可以在中间中断,如果有任何处理程序拒绝,成功处理程序将不会被调用,(确保打开DeVoToT控制台查看日志)。相反,您应该嵌套第二个处理程序并仅将其附加到需要它的承诺:

$http.get(url, params)
.then(function(res) {
    var data = res.data;
    if (data.status == 'ok' && data.rows.length > 0) {
        $scope.roomTypes = data.rows;
        return; // do nothing
    } else if (res.rows.length === 0 && $scope.request.roomType) {
        return $http.get(url2, params2)
        .then(function(res) {
            var data = res.data;
            if (data.status == 'ok')
                $scope.roomTypes.push({
                    room_type: data.roomType.id,
                    description: data.roomType.description
                });
            else
                throw "error";  //format of response unexpected it means something went wrong
        });
    }
})
.catch(function(res) {…})
.finally(function() {…});

代码中有一个输入错误:
function
res.data
应该是未定义的。但是
res
本身不应该。它被分配给
res.data
。这就是问题所在。@rmorrin,estus你是我的英雄!