Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.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 在jquery中使用Deferred/When延迟函数的问题_Javascript_Jquery_Jquery Deferred_Deferred - Fatal编程技术网

Javascript 在jquery中使用Deferred/When延迟函数的问题

Javascript 在jquery中使用Deferred/When延迟函数的问题,javascript,jquery,jquery-deferred,deferred,Javascript,Jquery,Jquery Deferred,Deferred,我真的很难使用延迟或jquery脚本。我在这里和其他地方(包括api.jquery.com)读过许多文章,我认为我只是有点太初学了,不知道如何使用这些调用 我试图将函数从运行推迟到脚本中的前一个函数完成 我有 function datapoints () { //My long function here where I define $data }; 其结果是一个名为$data的数组。我需要在下一个函数中定义$data变量,所以我想推迟它 我试着像这样设置延迟: var deferr

我真的很难使用延迟或jquery脚本。我在这里和其他地方(包括api.jquery.com)读过许多文章,我认为我只是有点太初学了,不知道如何使用这些调用

我试图将函数从运行推迟到脚本中的前一个函数完成

我有

function datapoints () {
    //My long function here where I define $data
};
其结果是一个名为$data的数组。我需要在下一个函数中定义$data变量,所以我想推迟它

我试着像这样设置延迟:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})
我真的很想得到一些关于如何清理的建议。我尝试过重新创建各种示例,但每次的结果都是控制台错误,表明$data未定义。我知道代码是有效的,因为当我在运行第二个函数之前手动输入setTimeout几秒钟时,一切正常,但我认为延迟是更好的解决方案

提前谢谢

请尝试以下代码:

function datapoints () {
    var deferred = $.Deferred();

    /* later, when data is ready, call:

        deffered.resolve(data);
    */

    return deferred.promise();
}


datapoints().then(function () {
    // runs when data is ready         
})

不完全确定你的问题是什么,但这对我来说很好

function datapoints () {
    //My long function here where I define $data
    return {"datapoint1": 1, "datapoint2": 2};
};

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (data){
    // My function here where I use $data
    console.log("data: ", data);
});

尝试如下方式修复代码:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})
这将确保您使用的数据实际上是
datapoints()
返回的数据

您还应该注意,除非
datapoints()
是一个异步函数,否则您编写的代码将阻止JS线程(即,如果在浏览器中运行,它将阻止UI)

同步函数的承诺/延期没有多大用处

通常的模式是这样的:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})

因此,
$data
是全局的
窗口。$data
?和
数据点
结果
使用它吗?因为您谈论的是
$data
,并且没有解释定义和用法(a)向我展示一些异步性,(b)
datapoints()
返回什么?@Roamer-1888-我认为这是我的问题,它实际上不是异步的。如问题中所述,datapoints()返回一个名为data.Meaghan的[array],在这种情况下,您不需要延迟/承诺。忽略所有尝试回答并使用标准阻止代码;还记得那种老式的编程方式吗?每行在前一行之后执行:),例如,
var datapoints=makeDatapoints();var结果=生成结果(数据点)
var result makeResult(makeDatapoints())。我认为您无意中回答了我的问题,其中有一行是“除非datapoints()是一个异步函数,否则您编写的代码将阻止JS线程(即,如果在浏览器中运行,它将阻止UI)。”我不认为这是一个异步函数。可能需要做更多的挖掘。