2016-05-12 132 views
0

这是一些代码。奇怪的Javascript关闭错误

function callServiceSync(url, obj) { 
    var result = true; 
    callServiceOptions(url, obj, function(res){ 
     result = res; 
     alert("RESULT CB: "+JSON.stringify(result)); 
    }, {async: false}); 
    alert("RESULT POST-CB: "+JSON.stringify(result)); 
    return result; 
} 

当它运行时,警告框说:

结果CB:{ “成功”:真正的 “数据”: “dtrombley”}

(这是什么web服务的回报,在现实中),然后输入:

结果POST-CB:真

为什么不对闭包变量的赋值工作?我误解JS如何关闭工作?我们可以调用jQuery的$ .ajax方法,它的最后一个参数选项扩展到某些默认值(在这种情况下,异步是禁用同步查询的),然后执行提供的回调。 ()

是$ .ajax()可能以某种方式执行某种方式,禁用/拧紧关闭(但是I调用cb,而不是$ .ajax()!)?如果是这样,如何解决这个问题?

为了完整(但实际上这个功能不应该能够搞砸我的想法):

function callServiceOptions(url, obj, cb, options) { 
    optSuccess = options.success; 
    optError = options.error; 
    opts = {} 
    $.extend({},options) 
    if (!opts.contentType) { 
     opts.contentType = "application/json"; 
    } 
    if (!opts.dataType) { 
     opts.dataType = "json"; 
    } 
    if (!opts.data && obj) { 
     opts.data = JSON.stringify(obj); 
    } 
    if (!opts.processData) { 
     opts.processData = false; 
    } 
    if (!opts.method) { 
     opts.method = "POST"; 
    } 
    opts.error = function(jqXHR, textStatus, errorThrown) { 
     if (optError) { 
      optError(jqXHR, textStatus, errorThrown); 
     } 
     if (jqXHR.responseText) { 
      responseObj = JSON.parse(jqXHR.responseText) 
      if (responseObj && responseObj.message) 
      cb({ 
       success: false, 
       message: responseObj.message 
      }) 
      return 
     } 
     cb({ 
      success: false, 
      message: errorThrown 
     }); 
    }; 
    opts.success = function(data, textStatus, jqXHR) { 
     if (optSuccess) { 
      optSuccess(data,textStatus,jqXHR); 
     } 
     cb(data); 
    }; 
    if (url.charAt(0) == '/') { 
     url = url.substr(1); 
    } 
    opts.url = WEBCTX.getBaseURL() + url; 

    $.ajax(opts); 
} 

这不是任何问题,询问如何从一个异步返回值的重复事件。我有一个工作的callServiceAsync(),它可以很好地完成。我正在使用同步模式,如果你不熟悉它,请在这个问题上通过...

+0

Quentin - 请仔细阅读该问题。我没有执行异步调用,我正在执行同步调用,并且该值从jQuery ajax()正确返回。 – BadZen

+1

不,有一个同步查询模式,这就是我正在使用的。请阅读http://api.jquery.com/jquery.ajax/上的文档,特别是关于我正在使用的“async”选项。 – BadZen

+0

如果它是异步的,警报不会按照该顺序返回,而是相反。 – BadZen

回答

6

你的功能是异步的。

虽然您创建了一个看起来像{async: false}的对象,但您将它作为第四个参数传递给callServiceOptions,因此它将被放置在options变量中。

你只能访问变量两次(options.successoptions.error),所以async属性是从来没有使用过任何东西(所以$.ajax使用的true默认值)。

在您拨打$.ajax(opts);之前加上console.log(opts)就会显示出来。

+0

啊,我的错误。我看到了'extend'逻辑,我认为这些选项正在扩展到opts。 – Quantastical

+2

@Quantastical,'.extend'修改第一个参数并返回它,但不捕获返回值。 – trincot

+0

Ook。我也是,''.extend(opts,options)'当然是我的意思。耻辱=)现在起作用。 – BadZen