【问题标题】:How can I add this function to an array without it being called immediately?如何将此函数添加到数组而不立即调用它?
【发布时间】:2015-04-23 23:34:10
【问题描述】:

我有一个返回 jQuery 延迟 AJAX 对象的函数数组,称为 phoneAjaxCalls。我的代码将多次调用推送到一个名为 newPhone 的函数,该函数接受两个参数。

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

我尝试使用此代码向newPhone 添加对phoneAjaxCalls 的调用,

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 中使用断点,我发现不是在调用 $.when 时调用 newPhone,而是在调用 .push 时调用。

如何在不立即调用newPhone 的情况下将调用添加到phoneAjaxCalls 数组?

我看到的错误是页面在phoneAjaxCalls 中的所有调用都可以完成之前被重定向。

如果您想查看我的整个代码库,可以查看here。这是一个可怕的混乱,因为这是一个匆忙的项目。也欢迎任何其他反馈,在这里或在 Github 上。有问题的文件可以在here 找到。

【问题讨论】:

  • 问题是代码被编写为立即启动 ajax 调用,然后返回一个承诺,当数据准备好时解决。
  • 您想要的事件顺序是什么?您想在稍后调用$.when 时将加载函数排队并启动它们吗?
  • 完整代码调用newPhone 3 次,在调用 done() 回调之前,我需要这三个调用完全完成。你说得对,我真正的意思是添加到数组中的 Promise 对象,而不是函数本身。
  • @NathanJones 如果您认为这是一个错误的问题,可以关闭它或删除 i
  • 你是什么意思“错误的功能”

标签: javascript jquery ajax promise


【解决方案1】:

你可以使用bind

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 () {

但是这个构造看起来像个 hack,你真的需要存储函数而不是结构化参数,或者尽快执行 ajax 调用吗?

使用 Promise 的正常方式是您在问题中显示的方式:您传递给 done 的回调 确实等待完成 Promise。

【讨论】:

  • 阅读了@TrueBlueAussie 的评论后,我认为我不需要存储实际函数,只需要存储延迟函数。也许我认为 push() 调用导致问题的假设是不正确的。
  • @NathanJones 是的,大多数情况下您只需要执行文档中显示的操作,即var d1 = $.Deferred(); var d2 = $.Deferred(); $.when( d1, d2 ).done(function ( v1, v2 ) {
  • $.call 是个东西?哇。
  • @Bergi 有点骇人听闻,是的...您如何简单地获取数组中函数返回的值的数组?
  • 我很满意这个问题被关闭了,因为它的解释不正确。如果需要,我将进行更多故障排除并发布另一个问题。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多