Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
承诺中的Javascript:.then()未执行?_Javascript_Jquery_Asynchronous_Promise - Fatal编程技术网

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

承诺中的Javascript:.then()未执行?,javascript,jquery,asynchronous,promise,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 }); pro

我想要一个脚本文件,用于从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,在脚本中访问该url以检索JSON后,我有一个.done:access.js

var sendData;

(function() {

        jqxhr = $.getJSON( url, {

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

    });
})();

function returnData(){
    return sendData;
}
因此,由于.done,访问URL的脚本中不应该存在任何异步问题。我真的不明白为什么这不起作用。我检查了我的页面,没有发现任何错误。有人能帮忙吗?

promise1永远无法解决

在您对promise1的定义中,您从未调用resolve函数来解析它。因此,它是。然后永远不会被呼叫

只有在executor函数中显式调用resolve时,才能解析手动创建的承诺

如果访问本身是异步的,那么我们需要更多地了解该函数,以帮助您正确地执行此操作。把承诺包装起来对你没有任何帮助。如果access本身返回一个承诺,那么您应该使用该承诺,而不是将其包装起来

access可能应该返回一个承诺,该承诺在异步操作完成后得到解决,然后您可以执行以下操作:

access().then(...).catch(...);
而且,不要用另一个承诺来包装它


sendData和returnData的内容看起来就是错误的。您必须解释并显示更多上下文,才能知道建议的确切内容。

如果访问是异步的,您永远不会解析Promise,那么您需要向我们显示该代码或解释调用方如何知道何时完成。像以前那样围绕访问包装承诺并没有任何用处。此外,returnData函数的设计看起来很糟糕,因为任何调用方都无法知道sendData值何时实际可用。@jfriend00我认为.done函数可以将数据发送到全局变量。那是个坏习惯吗?是的,这是个坏习惯。.done函数之外的任何人都不知道returnData何时实际有数据要返回。而且,您的$.getJSON上没有错误处理,也没有任何关于如何通信或处理错误的计划。access.js是我发布的最新代码,对不起。你是对的,我用错误的东西包装了一个承诺,access.js没有返回一个承诺。所以我应该将方法access.js本身配置为承诺?@h7651-我不知道access是什么。如果你展示代码,我们可以提出建议。但是,如果这里是异步操作,那么它应该是一个返回承诺的操作,您可以直接使用它,然后在它上面使用它,而不使用另一个承诺。