【问题标题】:Promise not returning the intended file in Angular.js承诺不会在 Angular.js 中返回预期的文件
【发布时间】:2015-11-18 04:16:57
【问题描述】:
function getJSON(url){
  return $http.get(url).success(function(response){

    var result = response['entries'][0];
    return result;

  });
};

我认为 $http 返回了 Promise,所以我做了以下操作:

getJSON(url).then(function (result) {
  console.log(result);
})

但是,当我记录结果时,我没有得到我在超时函数中记录的 JSON 文件,而是得到一个 HTML 响应文件。这就是我最终得到的结果:

Object {data: Object, status: 200, config: Object, statusText: "OK"}

您知道它为什么这样做吗?我可以做些什么来获取我在 $timeout 函数中登录的 JSON 文件?

【问题讨论】:

  • 看起来你找回了响应对象。 $timeout 中的console.log 是否对此事有所启发?
  • PS:你为什么需要$timeout
  • 更新范围值(应用显然会产生一些问题)。实际上,让我更新代码。
  • 你不应该需要$timeoutscope.$apply。也尽量不要使用成功。使用 .then 代替
  • 我认为这与成功有关,但你能告诉我具体是什么问题吗?你能告诉我如何在不破坏我的代码的情况下使用 .then 而不是成功吗?

标签: javascript angularjs promise


【解决方案1】:

把你的方法改成这样:

function getJSON(url){
  return $http.get(url).then(function(response){

    var result = response.data['entries'][0];
    return result;

  });
};

PS:最初您的问题中有一个$timeout,但情况有所不同。在这种情况下,.success 应该可以正常工作。唯一的问题是你不能在.success 调用之后继续链接承诺

【讨论】:

  • 你确定吗?我正在使用 1.3 顺便说一句。
  • 成功应该确实有效。 pham 说成功返回了 1.4 的承诺,但我使用的是 1.3,也许这就是问题所在。
  • 它在 1.3 中也返回了一个 Promise,唯一的问题是如果你以后想再添加一个 .then 给它,你不会得到成功函数返回的值。这意味着作为一种功能的承诺链的结束,或者它只是不正确地实现
  • 你确定不是var result = response.data['entries'][0];
  • 酷。正如我在另一个答案中所说。 .success 现在已弃用。我们都需要学习如何使用.then
【解决方案2】:

$http 确实返回了一个承诺。 (编辑我犯了一个错误)它的任何子方法也会返回一个承诺。

更新的分析器:不要在您的 success() 方法中返回任何内容。 error()then() 都不是

试试这个它会给你一个承诺

function getJSON(url){
  return $http.get(url)
};

getJSON(url).then(function (result) {
    console.log(result);
});

附:如果您想像在代码中所做的那样开展业务。我会建议你使用$q

function getJSON(url){
  var d = $q.dever();
  $http.get(url).then(function (res){
     d.resolve(res['entries'][0])
  });
  return d.promise;
};

getJSON(url).then(function (result) {
    console.log(result);
});

【讨论】:

  • 如果我不使用success如何得到响应?抱歉,我是 Angular 新手。
  • 成功确实返回了一个承诺
  • 使用.then 而不是.success。 BTW .success 现在已弃用。 docs.angularjs.org/api/ng/service/$http
  • 在回答您的问题之前,我想知道您使用的角度版本是什么。稍后我会用更好的建议更新答案。 (我可能错了,因为它似乎在版本 1.4.x 上 .success() 确实返回了一个承诺)
  • 你的最后一个例子是一个反模式, $http.get 已经返回了一个承诺。您可以简单地:.then(function(res){ return res.data['entries'][0]; })。不需要使用 $q
猜你喜欢
  • 2014-11-24
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多