我想要一个仅用于从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的任何异步问题。我真的不明白为什么这不起作用。我检查了我的页面,发现任何地方都没有错误。有人可以帮忙吗?
答案 0 :(得分:1)
promise1
从未解决。
在promise1
的定义中,您永远不会调用resolve()
函数来解决它。因此,.then()
永远不会被调用。
仅当您在执行程序函数中显式调用resolve()
时,手动创建的Promise才会得到解决。
如果access()
本身是异步的,那么我们将需要更多有关该函数的信息,以帮助您正确地完成此操作。兑现承诺并不能帮助您。如果access()
本身返回一个承诺,则应仅使用该承诺,而不能在其周围包裹一个承诺。
可能access()
应该返回一个诺言,该诺言在完成异步操作后将被解决,然后您可以执行以下操作:
access().then(...).catch(...);
而且,不要用其他诺言来包裹它。
sendData
和returnData()
的内容看起来是错误的。您必须解释并显示更多背景信息才能知道确切的建议。