如何使包含promise的函数返回值而不是promise?

时间:2015-01-26 23:38:23

标签: javascript promise q

说,我有一个函数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相同,headInheadOutpayWtInpayWtOut就会增加记录字段,当前一个和当前的id不同时,我们可以计算totalWeight并使用buildFunc函数将新记录推送到结果数组。在buildFunc函数中,我们检索headDays以便计算totalWeightgetHeadDays函数将在许多其他函数中调用。请让我知道,如果你有任何问题。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

你不能。

如果需要返回一个承诺,那么这是因为在某些事件发生之前该值不可用,并且该功能将在此之前(或至少可能)返回。这是承诺的重点。