【问题标题】:AJAX promise call handlingAJAX 承诺调用处理
【发布时间】:2016-05-27 10:26:01
【问题描述】:

我有一个 Ember 承诺电话如下;

var promise = new Ember.RSVP.Promise(function(resolve, reject) {
    return $.ajax({
    //want this common
        url: requestUrl,
        type: type, // HTTP method
        dataType: dataType, // type of data expected from the API response
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(postData)
    })
    .done(function(data, status, xhrObject) {
    //But want this to be different
      // resolve call
    })
    .fail(function(xhrObject, status, error){
      // reject call
    });
})

我的问题是我可以为 $.ajax() 使用通用代码,但对 done() 回调有不同的实现 我可以通过从调用位置传递一些参数来检查。

所以基本上,我想要

if (someparam == 'handleDone1')
    call resolve(data)
else
    call resolve({data})

【问题讨论】:

  • 避免使用Promise constructor antipattern!只需var promise = Ember.RSVP.Promise.resolve($.ajax(…));
  • 关于您的问题 - 没有什么可以阻止您在回调中简单地放置 if 语句,是吗?
  • 是的,我有一个外部函数,它有 var promise = new Ember.RSVP.Promise() 代码......所以如果我将任何参数说“someparam”传递给这个外部函数,我不能在 .done(function() {..}) 中访问它
  • “外部函数”是什么意思?你可以通过闭包访问任何你可以在回调之外访问的东西。
  • 如果我尝试将它传递给 done...done(function(data, status, xhrObject, paramFromExternalFn)),我会得到一个未定义的参数

标签: javascript jquery ajax ember.js rsvp-promise


【解决方案1】:

您当前通过将函数表达式硬编码到其中来将函数传递给done

用变量替换它。将值作为函数参数传递给该变量。

或者,这里根本不要使用done。只需返回$.ajax() 的返回值,然后在调用函数中调用done()

【讨论】:

  • 非常感谢您的帮助...但是您能否使用粗略/伪代码进行更新,以便更清晰......
【解决方案2】:

返回一个 promise 而不是 ajax 调用。并将 ajax 调用包装到 promise 中。

查看以下代码。它可能会有所帮助。

function someFunction(resolve1, reject1) {
  return new Ember.RSVP.Promise(function(resolve, reject) {
    $.ajax({
    //want this common
        url: requestUrl,
        type: type, // HTTP method
        dataType: dataType, // type of data expected from the API response
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(postData)
    })
    .done(function(data, status, xhrObject) {
      //But want this to be different
      // resolve call
      var dicision = resolve1();
      if(dicision){
        resolve(data);
      } else {
        resolve({data});
      }
    })
    .fail(function(xhrObject, status, error){
      // reject call
    });
}

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 2017-01-22
    • 2022-01-22
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多