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