Javascript:Promise中的.then()未执行?

时间:2018-11-05 00:51:06

标签: javascript jquery asynchronous promise

我想要一个仅用于从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;
}

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

1 个答案:

答案 0 :(得分:1)

promise1从未解决。

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

仅当您在执行程序函数中显式调用resolve()时,手动创建的Promise才会得到解决。

如果access()本身是异步的,那么我们将需要更多有关该函数的信息,以帮助您正确地完成此操作。兑现承诺并不能帮助您。如果access()本身返回一个承诺,则应仅使用该承诺,而不能在其周围包裹一个承诺。


可能access()应该返回一个诺言,该诺言在完成异步操作后将被解决,然后您可以执行以下操作:

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

而且,不要用其他诺言来包裹它。

sendDatareturnData()的内容看起来是错误的。您必须解释并显示更多背景信息才能知道确切的建议。