【问题标题】:Return second promise TypeScript Jquery promise返回第二个承诺 TypeScript Jquery 承诺
【发布时间】:2017-12-21 12:46:35
【问题描述】:

在下面的函数中,我试图返回第二个异步调用的承诺对象,但是打字稿抱怨该函数必须返回一个值。我不知道我怎么能做到这一点?我如何返回第二个承诺?

 private getSalesUrl<TServiceInput>(serviceCall: (args: TServiceInput) => JQueryPromise<IServiceResponseT>, args): JQueryPromise<any> {
        serviceCall(args).done(result => {  //1st async call
            if (result.serviceOutput) {
                if (result.serviceOutput.key === "URL") {
                    return tipsInterop.executeSalesRequest(result.serviceOutput.value);  //2nd async call
                }
            }
        });
    }

【问题讨论】:

  • returnserviceCall()done 回调中。您需要 return serviceCall(...) 才能让 serviceCall 返回内部返回...
  • 如果我返回 serviceCall,那么 getSalesUrl.done() 将在第一个异步调用的上下文中执行。我希望 getSaleUrl.done() 在第二次异步调用的上下文中执行。
  • A) 永远不要使用donefail,始终使用then。 B) 你实际上并没有从getSalesUrl 返回任何东西,你只是从 done 回调中返回了 return
  • @Bergi 我同意我现在没有返回任何东西,但是我如何返回第二个承诺?你能帮忙吗?

标签: jquery typescript promise


【解决方案1】:
  • 根据 OP 的请求和 SO cmets,我假设 OP 需要返回第二个请求的承诺
  • 这不应限于 TypeScript 或 JavaScript,因为它是 ajax 调用的基本功能
  • 本示例使用简单的 javascript 和 Jquery ajax 请求

var requests = {
  firstRequest: function() {
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1');
  },
  secondRequest: function() {
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2');
  }
};

var processResults = {
  callService: function() {
    return requests.firstRequest().then((data, textStatus, promise) => {
      return requests.secondRequest().then((data2, textStatus2, promise2) => {
        return "This is the content of second call: id=>" + data2.id;
      });
    });
  }
};

processResults.callService().then((data, textStatus, promise) => {
  console.log(data);
});
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

注意:

  • 我将返回第二个调用的数据包装到一个 Promise 中(默认情况下,如果您从 then 调用返回数据,它会被包装到一个新的 Promise 中,正如 @Bergi 所评论的那样)
  • 这是传递拦截和传递数据的一种方式
  • 传递第二次调用数据的另一种方法是返回 promise2,即使用 return promise2 而不是 return "This is the content of second call: id=&gt;"+ data2.id;

如果您将其与return promise2; 交换,则显示如下

var requests = {
  firstRequest: function() {
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1');
  },
  secondRequest: function() {
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2');
  }
};

var processResults = {
  callService: function() {
    return requests.firstRequest().then((data, textStatus, promise) => {
      return requests.secondRequest().then((data2, textStatus2, promise2) => {
        return promise2;
      });
    });
  }
};

processResults.callService().then((data, textStatus, promise) => {
  console.log(data);
});
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2016-06-22
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多