说,我有一个函数F1,将在许多其他函数中调用。 F1意味着返回将在F2中使用的值VAL。需要承诺来检索有助于计算VAL的所需数据。将F1作为承诺会在F2中造成很多混乱,因为F1通常在IF语句和FOR循环中调用。让我来说明这种情况:
function F1(param1, param2) {
var VAL = 0;
promise(param1, param2).then(function(data) {
for (var i = 0; i < data.length; i++) {
// Do some calculation here
}
});
return VAL;
}
function F2(x1, x2) {
var myArray = [],
someValue = 0;
if ([conditional expression]) {
someValue = F1(x1, x2);
call_some_function();
myArray.push({
val: someValue,
...
});
}
var x = someValue + y;
myArray.push({
id: x,
...
});
return myArray;
}
如何确保F1返回VAL(整数),以便将其用作同步函数?
提前感谢您的帮助。
修改
以下是代码的外观:
function myFunc(x, y) {
return init()
.then(function() {
return getData(x, y).then(function(data) {
if (data.length == 0) return [];
var id, name,
firstPass = true,
headIn = 0,
headOut = 0,
currentHead = 0,
payWtIn = 0,
payWtOut = 0,
expectedAdg = 0,
weight = 0,
results = [];
for (var i = 0; i < data.length; i++) {
if (firstPass) {
id = data[i].id();
name = data[i].name();
headIn = data[i].headIn();
headOut = data[i].headOut();
expectedAdg = data[i].expectedAdg();
firstPass = false;
}
if (id != data[i].id()) {
buildFunc();
reset();
}
headIn += data[i].headIn();
headOut += data[i].headOut();
payWtIn += data[i].payWtIn();
payWtOut += data[i].payWtOut();
}
buildFunc();
return results;
function buildFunc() {
currentHead = headIn - headOut;
var headDays = getHeadDays({ locationId: locationId, groupId: groupId, callDate: null });
var totalWeight = headIn != 0
? ((((headDays * expectedAdg) + payWtIn) / headIn) * currentHead) + payWtOut
: 0;
results.push({
id: id,
name: name,
headIn: headIn,
headOut: headOut,
headDays: headDays,
currentHd: currentHead,
totalWt: totalWeight
});
}
function reset() {
id = data[i].id();
name = data[i].name();
headIn = data[i].headIn();
headOut = data[i].headOut();
expectedAdg = data[i].expectedAdg();
payWtIn = 0;
payWtOut = 0;
weight = 0;
}
});
});
}
function getHeadDays(params) {
var VAL = 0;
promise(params.a, params.b).then(function(data) {
for (var i = 0; i < data.length; i++) {
// Make calculation to determine VAL here
}
});
return VAL;
}
init
函数在缓存中加载所需的实体(我正在使用BreezeJs)进行查询。 getData
函数获取按数据库中的id排序的原始数据,这些数据用于确定results
数组。当数据循环播放时,只要每条记录的id
相同,headIn
,headOut
,payWtIn
和payWtOut
就会增加记录字段,当前一个和当前的id不同时,我们可以计算totalWeight
并使用buildFunc
函数将新记录推送到结果数组。在buildFunc函数中,我们检索headDays
以便计算totalWeight
。 getHeadDays
函数将在许多其他函数中调用。请让我知道,如果你有任何问题。在此先感谢您的帮助。
答案 0 :(得分:3)
你不能。
如果需要返回一个承诺,那么这是因为在某些事件发生之前该值不可用,并且该功能将在此之前(或至少可能)返回。这是承诺的重点。