我怎么能这个功能添加到一个数组而不会被立即叫什么名字?(How can I add this fun

2019-10-22 18:46发布

我有这返回的jQuery推迟称为AJAX对象功能的阵列phoneAjaxCalls 。 我的代码推向一个调用的函数多次调用newPhone接受两个参数。

function newPhone(tlcPhone, studentsdcid) {
    //Create new email
    return $j.ajax({
        type: 'POST',
        url: '/admin/changesrecorded.white.html',
        data: tlcPhone
    });
}

我尝试将呼叫添加newPhonephoneAjaxCalls使用此代码,

phoneAjaxCalls.push(newPhone(tlcPhone, stagingFormPhone.studentsdcid));

再后来在我的代码,我使用

$.when.apply($j, phoneAjaxCalls).done(function () {
  //all phoneAjaxCalls MUST be complete before this code runs
  //Redirect to a different page by changing window.location
});

解决jQuery的deferreds的阵列。

通过使用DevTools断点,我发现的,而不是调用newPhone$.when被调用,但是当.push被调用。

我怎样才能加入通话newPhonephoneAjaxCalls阵列而不会被立即叫什么名字?

我看到的错误是,该页面被重定向所有的呼叫前phoneAjaxCalls就可以完成。

如果你想看到我的整个代码库,可以看出这里 。 这是可怕的乱七八糟的,因为它是一个匆忙的项目。 任何其他反馈意见是值得欢迎的还有,在这里或在Github。 有问题的文件中可以找到这里 。

Answer 1:

您可以使用绑定 :

phoneAjaxCalls.push(newPhone.bind(window, tlcPhone, stagingFormPhone.studentsdcid));

然后更改您的调用$.when这样才能真正调用返回所需的承诺的功能:

$.when.apply($j, $.map(phoneAjaxCalls, $.call.bind($.call)).done(function () {

或者,在一个更可读的方式:

$.when.apply($j, $.map(phoneAjaxCalls, function(f){ return f() }).done(function () {

但这种结构看起来像一个黑客,你真的需要尽快存储功能,而不是结构性的参数或代替执行Ajax调用?

使用承诺以正常的方式是你的问题显示一个:你传递给回调done 并等待承诺是fullfiled。



文章来源: How can I add this function to an array without it being called immediately?