最简单的方法-仅在ajax-request函数完成时才调用函数-回调,promise

时间:2019-04-16 06:58:24

标签: javascript jquery ecmascript-6

我有两个像这样的嵌套函数:

var userhascompany;

$(document).ready(function(){

    checkforcompany();


        if (Object.keys(localStorage).length > 0) {

            getaddjobcache();

        }

    });

checkforcompany();函数如下所示:

$.ajax({

    url: 'addjob_companycheck.php',
    success: function(dataresponse) {

        userhascompany = dataresponse;

    }

}); 

仅当变量getaddjobcache();有一个值或者ajax请求已完成时,才应调用函数userhascompany

2 个答案:

答案 0 :(得分:2)

修改checkforcompany()以返回由jqXHR创建的$.ajax(),因为它实现了thenable接口。我建议使用jQuery 3.x for consistent promise behavior,但是如果必须使用旧版本,通常可以将其包装在对Promise.resolve()的调用中,以将行为强制为符合诺言的行为。

function checkforcompany () {
  return $.ajax({
    url: 'addjob_companycheck.php'
  });
}

$(() => {
  checkforcompany().then(dataresponse => {
    const userhascompany = dataresponse;

    if (Object.keys(localStorage).length > 0) {
      getaddjobcache(userhascompany);
    }
  });
});

也不要依赖全局变量在上下文之间传递值。使getaddjobcache()接受userhascompany作为参数,如上所示。

最后,$() is recommended by jQuery instead of $(document).ready()

答案 1 :(得分:1)

有两种方法,一种是使用callback functions,另一种是使用.then blockasync-await

  

使用回调功能

var userhascompany;
$(document).ready(function(){
    checkforcompany();
});

function checkforcompany(){
    $.ajax({
        url: 'addjob_companycheck.php',
        success: function(dataresponse) {
            userhascompany = dataresponse;
            if (Object.keys(localStorage).length > 0) {
                getaddjobcache();

            }
        }

    });
}
  

使用promise .then

var userhascompany;
$(document).ready(function(){
    checkforcompany()
    .then(function(dataresponse){
        userhascompany = dataresponse;
        if (Object.keys(localStorage).length > 0) {
            getaddjobcache();

        }
    })
});

function checkforcompany(){
    return new Promise(function(resolve, reject){
        $.ajax({
            url: 'addjob_companycheck.php',
            success: function(dataresponse) {
               resolve(dataresponse)
            }
            error: function(err) {
               reject(err)
            }
        });
    })
}
  

使用jQuery ajax .done

var userhascompany;
$(document).ready(function(){
    checkforcompany()
    .done(function(dataresponse){
        userhascompany = dataresponse;
        if (Object.keys(localStorage).length > 0) {
            getaddjobcache();

        }
    })
});

function checkforcompany(){
    return $.ajax({
            url: 'addjob_companycheck.php',
        });
    })
}