AngularJS最好Promise.all在Promise中只有return第一
AngualrJS nest Promise.all in Promise only return the first
提前致谢。我是新手,坚持 AngularJs 诺言。
原码为:
$scope.fillInRO = function (data){
var defer = $q.defer();
$scope.receive_order = data.receive_order;
var orders = _.map(data.receive_order.purchase_orders,function (value) {
return {purchase_order:value};
});
$scope.fillInPOInitial(orders).then(
function (){
defer.resolve();
}
)
return defer.promise;
}
现在我需要添加另一个 Promise.all
let promises = ids.map((id,index) => {
PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
$scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
})
})
通过console.log知道res是:
res = {
purchase_items:[
{display_unit: "kg"},
{display_unit: "g"},
]
}
请求前,左值喜欢:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: null}},
{receive_order_item:{display_unit: null}},
]
请求后,值喜欢:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: null}},
]
但我想要的是:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: "g"}}, // here the diff
]
我不知道如何在 promise 中正确嵌套 promise.all,我试过这样做:
$q.all(promises).then(() =>{
$scope.fillInPOInitial(orders).then(
function (){
defer.resolve()
}
)
})
好像没什么区别,我还是得到第二个值为null:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: null}},
]
有什么想法吗?
promises 未在 promises 数组中返回,您在 promises 解析之前访问值,因此您没有获得正确的值。
let promises = ids.map((id,index) => {
return PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
$scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
})
})
然后传给$q.all(promises )
感谢@mzulch,我发现 AngularJs Promise 没有任何问题。错误出在对 ids.map 的调用中
再添加一个循环,问题解决:
let promises = ids.map((id) => {
PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
res.purchase_items.map((purchase_item, index) => {
data.receive_order.receive_order_items[index].receive_order_item.display_unit = purchase_item.display_unit
})
})
})
提前致谢。我是新手,坚持 AngularJs 诺言。 原码为:
$scope.fillInRO = function (data){
var defer = $q.defer();
$scope.receive_order = data.receive_order;
var orders = _.map(data.receive_order.purchase_orders,function (value) {
return {purchase_order:value};
});
$scope.fillInPOInitial(orders).then(
function (){
defer.resolve();
}
)
return defer.promise;
}
现在我需要添加另一个 Promise.all
let promises = ids.map((id,index) => {
PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
$scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
})
})
通过console.log知道res是:
res = {
purchase_items:[
{display_unit: "kg"},
{display_unit: "g"},
]
}
请求前,左值喜欢:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: null}},
{receive_order_item:{display_unit: null}},
]
请求后,值喜欢:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: null}},
]
但我想要的是:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: "g"}}, // here the diff
]
我不知道如何在 promise 中正确嵌套 promise.all,我试过这样做:
$q.all(promises).then(() =>{
$scope.fillInPOInitial(orders).then(
function (){
defer.resolve()
}
)
})
好像没什么区别,我还是得到第二个值为null:
$scope.receive_order.receive_order_items = [
{receive_order_item:{display_unit: "kg"}},
{receive_order_item:{display_unit: null}},
]
有什么想法吗?
promises 未在 promises 数组中返回,您在 promises 解析之前访问值,因此您没有获得正确的值。
let promises = ids.map((id,index) => {
return PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
$scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
})
})
然后传给$q.all(promises )
感谢@mzulch,我发现 AngularJs Promise 没有任何问题。错误出在对 ids.map 的调用中 再添加一个循环,问题解决:
let promises = ids.map((id) => {
PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
res.purchase_items.map((purchase_item, index) => {
data.receive_order.receive_order_items[index].receive_order_item.display_unit = purchase_item.display_unit
})
})
})