【问题标题】:How to use $q to return a value of an http request Async (using typescript)如何使用 $q 来返回一个 http 请求异步的值(使用打字稿)
【发布时间】:2014-09-01 20:01:52
【问题描述】:

我一直在尝试设置一个简单的 promise 异步结构来从 http 请求返回 json 返回的对象,但我找不到任何好的示例。我确定我做错了什么,但我无法理解它。

这是我正在尝试的:

getjsonObjAsync(): any {
    var deferred: ng.IDeferred<any> = this.$q.defer();
    $.ajax({
        url: AppSettings.jsonObjUrl,
        type: 'get',
    })
    .then((result) => {
        deferred.resolve(result);
    })
    return deferred.promise;
}

当我调用这个方法时,它会返回

Object {then: function, catch: function, finally: function}
catch: function (callback) {
finally: function (callback) {
then: function (callback, errback, progressback) {
__proto__: Object

但我希望它返回我从 http 请求中获得的 json 对象,我可以查看是否在此处添加 console.log(result):

    })
    .then((result) => {
        console.log(result)
        deferred.resolve(result);
    })

似乎我错误地使用了 $q 系统,但我想不出正确的方法来返回 json 对象。

我尝试按照此处的示例进行操作: https://stackoverflow.com/a/23572025/3757782 但它仍然无法从请求中返回 json 对象

谢谢!

【问题讨论】:

    标签: javascript json angularjs typescript q


    【解决方案1】:

    我认为您可能误解了 Promise 的工作原理。它们不会神奇地将异步操作转换为同步操作,因此除非您想阻止,否则不会从您的方法返回 JSON。

    您最终随代码返回的对象的 then 属性是一个为 Promise 注册处理程序的函数,它的使用方式与您对 $.ajax 调用的结果完全相同。

    【讨论】:

    • 感谢您的回答!这无疑帮助我解决了问题,(并解决了我的真正问题,即缺乏理解),但 basarat 的答案似乎是更直接的答案。
    【解决方案2】:

    由于您要返回promise,即return deferred.promise,因此您需要在另一端使用承诺,即:

    getjsonObjAsync().then((result)=>{
        console.log(result);
    });
    

    PS:比起$.ajax,更喜欢$http(和$http.get)。

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2012-03-09
      相关资源
      最近更新 更多