Javascript关闭未达到预期的效果。 (封包内部未保持大气值)

时间:2019-04-03 00:54:09

标签: javascript closures ecmascript-5

当我尝试使用闭包来维护用于异步函数回调的值时,我遇到了问题。

这些功能的基本操作顺序是:

  1. 我正在尝试使用Google一次通过多个航路点。因此,一次呼叫从x-> y-> z路由

  2. 如果失败,则路由将分为多个呼叫,并通过每个呼叫进行路由。因此,x-> y,然后是y-> z。

问题出在第二部分。在单个路由中有一个函数是一个同步函数,它导致另一个同步函数,而另一个同步函数又导致一个异步函数。然后,当它完成时,它使用回调使自己冒泡回到原始功能。

因此,例如:w将x调用y会调用z(这是异步的)。然后z将回调到y,后者将回调到x。当我回到x时,我知道w的范围已经消失了。但是,通过使用闭包,我希望能够保留这些值。但是,我仍然遇到经典的问题,即闭包只能解决声明了某个值的最终值。

这是使用ES5 javacript代码的。不幸的是,我的公司还没有走到可以使用babel在ES6上进行编译的步骤,因此ES5解决方案是必需的。我正在使用jquery,并尝试通过以下方式将闭包移动到回调中:

    DatabaseController.getSingleRoute(routingInfo, (function() {
        var testVal = Math.random() 
        return function(result,resultStatus){
            console.log(testVal) // still always the same value
    }())

我觉得这里缺少一些简单的东西,但却无法弄清正在发生什么。

我还应该注意,我还更改了代码,以使用GetSingleRouteHelper类的多个实例而不是一个实例,并将所有值设置为类变量,以便在每个实例中设置this.testVal = Math.random()。不过,从callbakcs返回后,每个类的值仍会得出完全相同的值。

注意:Math.random()只是我扔到那里尝试测试我的值的东西。它与我要传递的实际信息无关(即纬度和经度值)。因此,我不能只在回调中移动Math.random()。

    MapsController.getMultipleRoute(requests, function(res, status){
        // this would mean it has failed to get the route via multiple waypoints
        if (!status){
            // break up each request into individual requests
            for(var j = 0; j < results; j++){
                GetSingleRouteHelper.singleCarRoute(singleRouteInfo)
            }

        }
    }

    GetSingleRouteHelper.singleCarRoute = function(routingInfo){
        // what I have switched to to test. I need several atomic values that are generated in this scope. 
        var testVal = Math.random();
        (function(testVal2){
            console.log(testVal2) // here the value is as expected, is each individual random number that corresponds to the outer scopes "testVal" value
            DatabaseController.getSingleRoute(routingInfo, function(result, 
            resultStatus) {
                console.log(testVal2); // is always the final value that was declared. So if above function is run 10 times it will always be the 10th random number here.
            }
        }(testVal))


    DatabaseController.getSingleRoute(data, callback){
         // verifies some values are expected before sending forward
         ...
         GetSingleRoute.get(data, function(a,b){ 
         // verify integrity of return values
         ...
         callback(a,b)
         });
    }


    GetSingleRoute.get= function (data, callback) {
       $.ajax({
       type: "GET",
       ws: "fetch_location",
       dataType: "json",
       data: data,
       success: function success(res) {
         callback(result, result.status)
       },
    }

我希望在DatabaseController.getSingleRoute函数的回调中,testVal的值应为闭合范围的正确随机数。我正在获得最终价值。因此,如果该函数运行两次,并且第一个随机数为.3254,第二个随机数为.2345,则当激活DatabaseController.getSingleRoute回调时,console.log语句将记录日志。 .2345 .2345 代替 .3252 .2345

0 个答案:

没有答案