【问题标题】:Javascript: .then() in promise is not executing?Javascript:promise 中的 .then() 没有执行?
【发布时间】:2018-11-05 00:51:06
【问题描述】:

我想要一个仅用于从 url 访问 JSON 的脚本文件。我希望有一种方法可以将脚本中的 JSON 对象返回到单独的脚本文件中的 var 中,然后相应地对其进行修改。显然,由于 javascript 是异步的,如果我简单地写出来它就会失败。因此我必须使用一个承诺:

var promise1 = new Promise(function(resolve, reject) {
  access(userSearchText); //send user input to get appropriate JSON object
});

promise1.then(function(value) {
  var getData = returnData();     //method that returns JSON object from the other script
  alert(getData);                 //print out the returned JSON object
  console.log("we have finished");
});

但这并没有打印出任何东西。警报根本没有发生,并且控制台中没有打印任何内容。我正在使用 jquery 访问另一个脚本中的 url,并且在脚本中访问它以检索 JSON 后,我有一个 .done:access.js

var sendData;

(function() {

        jqxhr = $.getJSON( url, {

        })
        .done(function( data ) {
            sendData = data;

    });
})();

function returnData(){
    return sendData;
}

因此,在访问 URL 的脚本中不应该因为 .done 而出现任何异步问题。我真的不明白为什么这不起作用。我检查了我的页面,在任何地方都看不到任何错误。有人可以帮忙吗?

【问题讨论】:

  • 你永远不会兑现承诺
  • 如果access() 是异步的,那么您需要向我们展示该代码或解释调用者如何知道它何时完成。像你所做的那样围绕access() 包装一个承诺并没有任何用处。
  • 另外,您的 returnData() 函数看起来是一个糟糕的设计,因为任何调用者都无法知道 sendData 值何时实际可用。
  • @jfriend00 我认为 .done 函数可以将数据发送到全局变量。这是不好的做法吗?
  • 是的,这是一种不好的做法。在.done() 函数之外没有人知道returnData() 何时真正有数据要返回。而且,您的$.getJSON() 上没有错误处理,也没有任何关于如何沟通或处理错误的计划。

标签: javascript jquery asynchronous promise


【解决方案1】:

promise1 永远不会得到解决。

在您对promise1 的定义中,您永远不会调用resolve() 函数来解决它。因此,.then() 永远不会被调用。

只有在执行器函数中显式调用 resolve() 时,手动创建的 Promise 才会被解析。

如果access() 本身是异步的,那么我们将需要更多关于该函数的信息来帮助您正确执行此操作。将承诺包装在它周围不会对您有任何帮助。如果access() 本身返回一个promise,您应该只使用该promise 而不要将其包裹起来。


可能access() 应该返回一个在异步操作完成时解决的承诺,然后你可以这样做:

access().then(...).catch(...);

而且,不要用另一个承诺来包装它。

sendDatareturnData() 的东西看起来不对。您必须解释并显示更多背景信息才能知道推荐的具体内容。

【讨论】:

  • access.js 是我发布的最后一个代码,抱歉。你是对的,我在错误的事情上包装了一个承诺,而 access.js 没有返回一个承诺。所以我应该将方法 access.js 本身配置为一个承诺?
  • @h7651 - 我不知道access() 是什么。如果您显示代码,我们可以提出建议。但是,如果这里是异步操作,那么它应该是返回一个 Promise 的操作,您可以在其上使用 .then() 而无需将其包装在另一个 Promise 中。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多