如何在不立即调用的情况下将此函数添加到数组中?

时间:2015-04-23 14:55:00

标签: javascript jquery ajax promise

我有一个函数数组,它们返回名为phoneAjaxCalls的jQuery延迟AJAX对象。我的代码将多次调用推送到一个名为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延迟数组。

通过在DevTools中使用断点,我发现在调用newPhone时调用$.when,而不是在调用.push时调用。{/ p>

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

我看到的错误是,在- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees { CGFloat radians = DegreesToRadians(degrees); UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.size.width, self.size.height)]; CGAffineTransform t = CGAffineTransformMakeRotation(radians); rotatedViewBox.transform = t; CGSize rotatedSize = rotatedViewBox.frame.size; UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, [[UIScreen mainScreen] scale]); CGContextRef bitmap = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(bitmap, rotatedSize.width / 2, rotatedSize.height / 2); CGContextRotateCTM(bitmap, radians); CGContextScaleCTM(bitmap, 1.0, -1.0); CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2 , self.size.width, self.size.height), self.CGImage ); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 中的所有通话都可以完成之前,网页会被重定向。

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

1 个答案:

答案 0 :(得分: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 () {

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

使用promises的正常方法是您在问题中显示的方式:您传递给done 的回调确实等待以便承诺完整填写。