Javascript 返回inventoryData在承诺值返回之前激发
我有以下异步返回值的方法<代码>返回清单数据似乎在填充其余值之前触发。以下是日志: 我想等到所有的值都被检索出来后,再触发Javascript 返回inventoryData在承诺值返回之前激发,javascript,angularjs,Javascript,Angularjs,我有以下异步返回值的方法返回清单数据似乎在填充其余值之前触发。以下是日志: 我想等到所有的值都被检索出来后,再触发returninventorydata。我该怎么做 function checkInventoryUrl(url, size, code) { var inventoryData = {}; return $http.get(url).then(function(response) { var html = response.data; // retur
returninventorydata
。我该怎么做
function checkInventoryUrl(url, size, code) {
var inventoryData = {};
return $http.get(url).then(function(response) {
var html = response.data;
// returns value instantly
inventoryData.url = url;
// parses html, takes a few seconds to return value
inventoryData.name = getProductName(html);
inventoryData.price = getPrice(html);
// returns promise
getProductQty(html, size).then(function(result) {
if(result) {
inventoryData.qtyAvailable = result;
console.log(inventoryData);
}
});
// returns promise
getProductMaxOrder(html, size).then(function(result) {
if(result) {
inventoryData.maxOrder = result;
console.log(inventoryData);
}
});
// returns promise
getProductSize(html, size).then(function(result) {
if(result) {
inventoryData.size = result;
console.log(inventoryData);
}
});
// fired straight away returns empty object
return inventoryData;
});
}
这是出于设计,也是承诺的作用。您需要将您的承诺相互链接(在thens中),然后您需要返回上一个承诺中的inventoryData,或者只是返回承诺并继续从中工作。这是出于设计,以及承诺是如何工作的。您需要将您的承诺相互链接(在then中),然后您需要返回上一个承诺中的inventoryData,或者只返回承诺并继续从中工作。您可以使用它来获取一系列承诺,并且当所有传递的承诺都已解决时,您可以调用
。然后方法调用
例如:
function checkInventoryUrl(url, size, code) {
var inventoryData = {};
....
....
inventoryData.url = url; // parses html, takes a few seconds to return value
inventoryData.name = getProductName(html);
var p0 = inventoryData.price = getPrice(html); // returns promise
var p1 = getProductQty(html, size);
var p2 = getProductMaxOrder(html, size);
var p3 = getProductSize(html, size);
Promise.all([p0, p1, p2, p3,])
.then(function(values){
// Called when all promises passed in resolve
});
}
您可以使用which,它可以接受一个承诺数组,当所有传递的承诺都已通过解析时,您可以调用。然后方法调用
例如:
function checkInventoryUrl(url, size, code) {
var inventoryData = {};
....
....
inventoryData.url = url; // parses html, takes a few seconds to return value
inventoryData.name = getProductName(html);
var p0 = inventoryData.price = getPrice(html); // returns promise
var p1 = getProductQty(html, size);
var p2 = getProductMaxOrder(html, size);
var p3 = getProductSize(html, size);
Promise.all([p0, p1, p2, p3,])
.then(function(values){
// Called when all promises passed in resolve
});
}
JavaScript是单线程的。不能将函数设置为“等待”。函数执行直到返回。它只能返回可用的值或稍后从服务器返回数据时满足的挂起承诺
要为inventoryData
创建承诺,请使用:
$q.all
方法接受一个对象,该对象的部分或全部属性可能会在该对象上显示。它返回一个promise,该promise使用单个promise的所有已实现值来解析Completed,或使用第一个被拒绝的promise的值来解析rejects
使用:
checkInventory(url, size, code).then(function (inventoryData) {
console.log(inventoryData);
}).catch(function(errorResponse) {
throw errorResponse;
});
JavaScript是单线程的。不能将函数设置为“等待”。函数执行直到返回。它只能返回可用的值或稍后从服务器返回数据时满足的挂起承诺
要为inventoryData
创建承诺,请使用:
$q.all
方法接受一个对象,该对象的部分或全部属性可能会在该对象上显示。它返回一个promise,该promise使用单个promise的所有已实现值来解析Completed,或使用第一个被拒绝的promise的值来解析rejects
使用:
checkInventory(url, size, code).then(function (inventoryData) {
console.log(inventoryData);
}).catch(function(errorResponse) {
throw errorResponse;
});
你能给我举个例子说明如何用我的代码做到这一点吗?$q.all
将是一个很好的开始:你能给我举个例子说明如何用我的代码做到这一点吗?$q.all
将是一个很好的开始:我如何从承诺内返回股票数据。all?我如何从承诺内返回股票数据。all?