【发布时间】: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